参考:
Objective-C +load vs +initialize
Objective-C 中的+initialize 和+load
《Effective Objective-C 2.0》 第51条: 精简initialize与load的实现代码
1.简介
有时候类必须先执行某些初始化操作,才能正常使用。继承自Objective-C的类有2个方法,可以用来实现这种初始化操作。load方法 和 initialize方法。
2.load方法
谁会调用
对于加入运行期系统的类和分类会调用load方法,而且仅调用一次。
调用时机
当包含类或分类的程序库载入系统时,会执行此方法,iOS通常是在应用程序启动的时候。 对于Mac OS,可以使用动态加载的特性,在应用程序启动后再加载程序库。
调用顺序
在执行子类的load方法之前,必定会先执行所有超类的load方法。
分类和类都实现了load方法,会先调用类里的,再调用分类里的。
对于某个程序库,无法判断出其中各个类的载入顺序,所以在load方法中使用其他类不安全。
调用方式
load方法是直接通过函数的内存地址方式调用的,不是通过消息发送方式调用的。所以不遵守那套继承规则。
用途
应用程序在执行load方法的时候会阻塞,所以load方法中不要包含繁杂的代码。
真正用途仅用于调试程序。
3.initialize方法
调用时机
initialize方法是懒加载的。 是在应用程序首次用该类之前调用。
调用方式
runtime使用发送消息 objc_msgSend 的方式对 +initialize 方法进行调用,如果某各类未实现,会运行超类的实现代码。
因为initialize遵守覆写规则,如果需要类的initialize方法中的代码只执行一次,可以加判断
+ (void)initialize {
if (self == [ClassName self]) {
// ... do the initialization ...
}
}
调用特点
当initialize方法调用的时候,运行期系统处于正常状态,可以调用任何类的任何方法。