- 由于 Load 和 Object 都属于类加载的机制,都属于 NSObject 里面的函数, 所以离开NSObject 离开运行时也就无所谓这两个函数了。
- Load 发生在应用冷启动加载的时候,不参与系统的override机制,先加载类的Load , 再加载 category 的 Load , 无关继承链。
- initialize 发生在第一次调用该类的时候,但是它关联继承链, 所以如果子类和父类都实现了 initialize 方法,会先调用父类的initialize ,然后调用子类的。
@implementation LoadingObject
//无法再编译器确定的全局变量,可以设置到initialize里面初始化
static NSMutableArray* array;
+ (void)initialize {
if (self == [LoadingObject class]) {
NSLog(@"initialize LoadingObject");
array = @[].mutableCopy;
}
}
+ (void)load {
//error1: 为什么先打印了initialize, 因为调用self description 的方法
NSLog(@"load LoadingObject");
}
@end
@interface LoadingChildObject : LoadingObject
@end
@implementation LoadingChildObject
+ (void)initialize {
NSLog(@"initialize LoadingChildObject");
}
+ (void)load {
NSLog(@"load LoadingChildObject");
}
@end
Extension:
- Load 发生在 main() 函数之前之前,点击图标系统 exec() 之后。
- 由于执行 main() 之前还是一个单线程操作,所以不建议在 load 里面执行过多操作,要优化启动,确实需要放到 initialize 里面。