load和initialize区别
load
和 initialize
区别
1、load 是根据函数地址直接调用
2、initialize 是通过 objc_msgSend 调用
调用时刻
1、load 是 runtime 加载类、分类的时候调用
2、initialize 是类第一次接收到消息的时候调用
- 每接收到一次消息,只会调用一次 initialize
- 若子类未实现 initialize 方法, 会调用父类的 initialize 方法, 所以父类的 initialize 方法可能会调用多次
load
是只要类所在文件被引用就会被调用,而initialize
是在类或者其子类的第一个方法被调用前调用。所以如果类没有被引用进项目,就不会有load
调用;但即使类文件被引用进来,但是没有使用,那么initialize
也不会被调用;load
每个类只会调用一次,initialize
也只调用一次,但是如果子类没有实现initialize
方法则会调用父类的方法,因此作为父类的initialize
方法可能会调用多次。
load 和 initializee 的调用顺序
1、load:
- 先调用类的 load, 在调用分类 的oad
- 先编译的类, 优先调用 load, 调用子类的 load 之前, 会先调用父类的load
- 先编译的分类, 优先调用 load
2、initialize
- 先初始化分类, 后初始化子类
- 通过消息机制调用, 当子类没有 initialize 方法时, 会调用父类的 initialize 方法, 所以父类的 initialize 方法会调用多次
+ (void)load {
}
+ (void)initialize {
}
load
父类调用顺序按照 Compile Sources 调用initialize
调用顺序按照 Compile Sources 反向的顺序
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!