load
- +load方法会在runtime加载类、分类时调用
- 每个类、分类的+load,在程序运行过程中只调用一次
- 调用顺序:
3.1 先调用类的+load(按照编译先后顺序调用(先编译,先调用),调用子类的+load之前会先调用父类的+load)
3.2 再调用分类的+load(按照编译先后顺序调用(先编译,先调用))
initialize
- initialize方法会在类第一次接收到消息时调用
- 调用顺序
2.1 先调用父类的+initialize,再调用子类的+initialize
2.2 先初始化父类,再初始化子类,每个类只会初始化1次
load与initialize对比
条件 | +load | +initialize |
---|---|---|
关键方法 | (*load_method)(cls, SEL_load) | objc_msgSend |
调用时机 | 被添加到 runtime 时 | 收到第一条消息前,可能永远不调用 |
调用顺序 | 父类->子类->分类 | 父类->子类 |
调用次数 | 1次 | 多次 |
是否需要显式调用父类实现 | 否 | 否 |
是否沿用父类的实现 | 否 | 是 |
分类中的实现 | 类和分类都执行 | 覆盖类中的方法,只执行分类的实现 |
网友评论