load:
当类或者类别添加到objc的runtime中时调用,使用此方法执行类的特定行为。
初始化的顺序为:
1、链接到所有框架的初始化
2、所有的+load方法
3、所有的c++静态初始化函数和c/c++构造函数
4、链接到你的框架中的所有初始化
in addition:
· 在所有的父类的+load方法调用完成之后调用类的+load方法
· 分类的+load方法在类本身的+load方法之后调用。
· Swift类桥接到Objective-C的加载方法的自定义实现不会自动调用。
initialize:
在收到第一条消息之前初始化该类
runtime会在程序之前发送初始化给程序中的每个类,或者从该程序继承的任何类中发送它的第一条消息。 父类在它们的子类之前收到此消息。
runtime以线程安全的方式将初始化消息发送给类。 也就是说,初始化由第一个线程运行以向类发送消息,并且任何尝试向该类发送消息的其他线程都将阻塞,直到初始化完成。
如果子类不实现初始化 - runtime将调用继承的实现 - 或者子类显式调用[super initialize],则父类实现可能会被多次调用。 如果你想保护自己不被多次运行,你可以按照以下方式构建你的实现:
+ (void)initialize {
if (self == [ClassName self]) {
// ... do the initialization ...
}
}
因为初始化是以阻塞的方式调用的,所以将方法实现限制到尽可能少的工作量是很重要的。 具体来说,任何其他类在其初始化方法中可能需要锁的代码都可能导致死锁。 因此,您不应该依赖于初始化来进行复杂的初始化,而应该将其限制为直接的类本地初始化。
每个类只能调用一次initialize。 如果你想对类和类的类别进行独立的初始化,你应该实现load方法。