+load和+initialize笔记

+initialize

  1. + (void)initialize 消息是在该类接收到其第一个消息之前调用。关于这里的第一个消息需要特别说明一下,对于 NSObjectruntime 机制而言,其在调用 NSObject+ (void)load 消息不被视为第一个消息,但是,如果像普通函数调用一样直接调用 NSObject+ (void)load 消息,则会引起 + (void)initialize 的调用。反之,如果没有向 NSObject 发送第一个消息,+ (void)initialize 则不会被自动调用。

  2. 在应用程序的生命周期中,runtime 只会向每个类发送一次 + (void)initialize 消息,如果该类是子类,且该子类中没有实现 + (void)initialize 消息,或者子类显示调用父类实现 [super initialize], 那么则会调用其父类的实现。也就是说,父类的 + (void)initialize 可能会被调用多次。`

    @implementation MyClass
    //在父类使用
    + (void)initialize {
        if (self == [MyClass class]) {
            ...
        }
    }
    ...
    @end
  3. 如果类包含分类,且分类重写了initialize方法,那么则会调用分类的 initialize 实现,而原类的该方法实现不会被调用,这个机制同 NSObject 的其他方法(除 + (void)load 方法) 一样,即如果原类同该类的分类包含有相同的方法实现,那么原类的该方法被隐藏而无法被调用。

  4. 父类的 initialize 方法先于子类的 initialize 方法调用。

+load

  1. + (void)load 会在类或者类的分类添加到 Objective-c runtime 时调用,该调用发生在 application:willFinishLaunchingWithOptions: 调用之前调用。

  2. 父类的 +load 方法先于子类的 +load 方法调用,类本身的 +load 方法先于分类的 +load 方法调用。

  3. runtime 调用 +load的时候,程序还没有建立其 autorelease pool,所以那些会需要使用到 autorelease pool 的代码,都会出现异常。这一点是非常需要注意的,也就是说放在 +(void)load 中的对象都应该是 alloc 出来并且不能使用 autorelease 来释放。

你可能感兴趣的:(ios)