类编译后,相关的数据结构会保留在目标文件中,在运行时得到解析和使用(类的加载和初始化)。在运行期提前并且自动调用这两个方法,我们可以利用他们在类被使用前,做一些预处理工作。
initialize
在类接收第一个消息之前调用,运行环境基本健全,运行过程中是线程安全的.
父类接受这个消息在它的子类之前.
父类initialize会被调用多次:如果子类没有实现initialize,runtime会调用从父类继承的initialize;或者子类调用[super initialize]。
避免被多次调用如下:
+ (void)initialize {
if (self == [ClassName self]) {
// ... do the initialization ...
}
}
load
在类或类目被加载的时候调用
类的load调用在父类load后
类目的load调用在类本身load后
load 和 initialize 的区别
- 在不考虑开发者主动使用的情况下,系统最多会调用一次
- 如果父类和子类都被调用,父类的调用一定在子类之前
- 都是为了应用运行提前创建合适的运行环境
- 在使用时都不要过重地依赖于这两个方法,除非真正必要
load:只要类所在文件被引用就会被调用,
initialize:在类或者其子类的第一个方法被调用前调用。
所以如果类没有被引用进项目,就不会有load调用;但即使类文件被引用进来,但是没有使用,那么initialize也不会被调用。