Effective Objective-C 2.0

📚Effective OC - Tip 51: 精简 initi

2017-01-08  本文已影响11人  小万叔叔
  1. 由于 Load 和 Object 都属于类加载的机制,都属于 NSObject 里面的函数, 所以离开NSObject 离开运行时也就无所谓这两个函数了。
  2. Load 发生在应用冷启动加载的时候,不参与系统的override机制,先加载类的Load , 再加载 category 的 Load , 无关继承链。
  3. 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:

  1. Load 发生在 main() 函数之前之前,点击图标系统 exec() 之后。
  2. 由于执行 main() 之前还是一个单线程操作,所以不建议在 load 里面执行过多操作,要优化启动,确实需要放到 initialize 里面。
上一篇 下一篇

猜你喜欢

热点阅读