load
load 会在类或分类被添加到runtime时调用。并且只会被runtime调用一次。
如果子类没有实现,父类的load方法也不会被再次调用。
load 的调用顺序。
- 链接的framework
- 自己的image
- c++ 静态初始化方法,具有
__attribute__(constructor)修饰的函数 - 链接到你的image
其它: - 父类优先子类
- 类优先分类(category )
initialize
initialize 会在类被使用前调用。包括类方法。
比如下面的代码。在load内调用[self class]会导致initialize被调用。
+ (void)load
{
NSLog(@"%@ %s", [self class], __FUNCTION__);
}
+ (void)initialize
{
NSLog(@"%@ %s", [self class], __FUNCTION__);
}
每个类都会被runtime线程安全的调用一次initialize方法。
父类会在子类前被调用。
如果子类没有实现或者调用[super initialize],则父类会被再次调用。
下面的代码可以保证只执行一次初始化操作。
+ (void)initialize {
if (self == [ClassName self]) {
// ... do the initialization ...
}
}