• GCD如何控制最大并发

    NSOperation可以通过 maxConcurrentOperationCount 来控制并发数,而NSOperation又是基于GCD封装的,那么GCD怎么来控制并发呢? 通过信号量 把并发任务都放在一个串行队列中,然后每次取出一个任务来wait信号量,同时异步去执行,执行完毕之后再notify回来 ...

    kvo跟KVOController

    kvo实现原理系统会生成一个中间类,让对应对象的isa指向该中间类,同时系统在该中间类覆写setter方法,达到通知的目的 那成员变量等非property怎么办? 需要自己手动处理,方式也是类似的,自己手动设置setter方法,在setter方法中手动调用 willChangeValueForKey 跟 di...

    不强持有对象的集合

    前几天有同事在讨论想设计一个检查内存不释放的功能(主要是viewcontroller),大体思路就是每次pushviewcontroller的时候把vc加入到一个集合中,然后pop出去的时候延迟几秒之后在该集合内检查对应vc是否被释放。但是如果用普通的NSArray或者NSDictionary肯定是不行的,因为会...

    Associated Object实现原理

    通过AssociationsManager来统一管理所有的associated objects。用一个导图就能很清楚的了解:

    load跟initialize

    load系统加载load方法大致可以梳理成如下几步: 准备load方法 递归获取superclass,获取load方法,加入待加载class load方法表(所以父类的load在最前) 按照category编译顺序加载category中的load方法,加入到另一个待加载category load方法表 从头...

    Bounds

    都知道bounds是相对于自己的坐标系,默认的bounds起点是(0, 0)。那改变bounds的position之后会产生什么结果呢? 1234567891011UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 280, 250)]...

    Autorelease相关

    autorelease对象释放时机? 在当前runloop循环结束的时候,runloop会执行objc_autoreleasePoolPop(context),这个操作才是真正释放autorelease对象的操作(具体实现后面会讲到)。或者是手动的@autoreleasepool{}结束之后,因为编译器会在@...

    iOS block高级用法 - debounce跟throttle

    debounce跟throttle是其他语言中(如js)比较常见且常用的两个函数,直译就是防抖跟节流。debounce主要指在一定时间内重复调用某一函数,函数的执行会被一直推迟,直到在规定时间间隔内没有再触发该函数,才会去执行,同时只执行最后一次;throttle正好相反,是在某一时间内,只执行第一次。这么看可能...

    GCD 线程与队列

    最近看到一个文章里面有这么一段话:每个应用都只有一个主线程,但主线程中可能有多个队列,则不仅仅只有主队列。突然发现自己对于线程跟队列这两个概念有些分辨不清,所以在这里重新梳理一下。 基本概念 队列:可以理解为一个FIFO的列表,里面装着需要执行的任务。gcd会从队列中取任务,然后放到对应的线程中去执行。 串行队...

    NSOperation串行并行理解

    NSOperation是iOS中实现多线程的一个重要模块,在这里整理一些容易忽略或者模糊的点,不会有太多基础的知识。 先大致介绍一些基本知识。 核心的两个类 NSOperation 和 NSOperationQueue概述 NSOperation可以理解为待执行的任务。 NSOperationQueue是保存任务...