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 ...
}
}