Runloop应用: Timer失效问题; 线程保活; Runloop的运行逻辑: 入口函数 通知Observers:进入Loop; 通知Observers:即将处理Time...

Runloop应用: Timer失效问题; 线程保活; Runloop的运行逻辑: 入口函数 通知Observers:进入Loop; 通知Observers:即将处理Time...
objc_msgSend()实现 3. 消息转发:__forwarding__ 这个阶段代码没有开源,这里有一份国外整理的伪代码(提取码: du9w). 以下方法都有实例方法...
传送门: Runtime的几个常规应用 类相关: 动态创建一个类(参数:父类,类名,额外的内存空间) Class objc_allocateClassPair(Class s...
场景如下: 当离开作用域时,person对象销毁,所以“1”号线消失; “2”、“3”因为是强引用,所以相互持有,对方都不会得到释放。 解决: RAC 环境下: __weak...
方法: - (void)setValue:(id)value forKeyPath:(NSString *)keyPath;- (void)setValue:(id)valu...
KVO的本质: 本质是重写set方法。 1、利用Runtime API 动态生成一个全新的子类,并且让instance对象的isa指向这个全新的子类;2、当修改instanc...
Category的原理 Category编译之后的底层结构是struct category_t,里面存储着分类的对象方法、类方法、属性、协议信息; 在程序运行的时候,runt...
+load方法会在runtime加载分类、类时调用; (即使这个类根本没有调用过) 每个类、分类的+load都会调用,且在程序运行过程中只调用一次; 类和分类中 +load的...
+initialize方法会在类第一次接收到消息时调用; 调用顺序: 先调用父类的+initialize,再调用子类的。(先初始化父类,再初始化子类,每个类只会初始化1次。)...