Category - initialize
initialized
- +initialized方法会在类第一次接收到消息时调用
- 调用顺序
- 先调用父类的+initialize,再调用子类的+initialize
- 先初始化父类,再初始化子类,每个类只会初始化1次
- +initialize和+load的很大区别是,+initialize是通过objc_msgSend进行调用的,所以有以下特点
- 如果子类没有实现+initialize,会调用父类的+initialize(所以父类的+initialize可能会被调用多次)
- 如果分类实现了+initialize,就覆盖类本身的+initialize调用
objc4源码解读
- objc-msg-arm64.s,汇编级别的源码
- objc_msgSend,消息发送汇编源码
- objc-runtime-new.mm
- class_getInstanceMethod
- lookUpImpOrNil
- lookUpImpOrForward
- _class_initialize
- callInitialize
- objc_msgSend(cls, SEL_initialize)
源码分析,objc-runtime-new.mm文件
class_getInstanceMethod
1 | /*********************************************************************** |
lookUpImpOrNil
1 | /*********************************************************************** |
lookUpImpOrForward
1 | IMP lookUpImpOrForward(Class cls, SEL sel, id inst, |
_class_initialize
1 | /*********************************************************************** |
callInitialize
1 | void callInitialize(Class cls) |
高频面试
Category中有load方法吗?load方法是什么时候调用的?load 方法能继承吗?
- 有load方法
- load方法在runtime加载类、分类的时候调用
- load方法可以继承,但是一般情况下不会主动去调用load方法,都是让系统自动调用
load、initialize方法的区别什么?它们在category中的调用的顺序?以及出现继承时他们之间的调用过程?
- 分别在两个笔记里面顶部体现
Category能否添加成员变量?如果可以,如何给Category添加成员变量?
- 不能直接给Category添加成员变量,但是可以间接实现Category有成员变量的效果
参考
李明杰老师课件- objc源码
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ivan's Blog!
评论









