+initialize
+ (void)initialize
消息是在该类接收到其第一个消息之前调用。关于这里的第一个消息需要特别说明一下,对于NSObject
的runtime
机制而言,其在调用NSObject
的+ (void)load
消息不被视为第一个消息,但是,如果像普通函数调用一样直接调用NSObject
的+ (void)load
消息,则会引起+ (void)initialize
的调用。反之,如果没有向NSObject
发送第一个消息,+ (void)initialize
则不会被自动调用。在应用程序的生命周期中,
runtime
只会向每个类发送一次+ (void)initialize
消息,如果该类是子类,且该子类中没有实现+ (void)initialize
消息,或者子类显示调用父类实现[super initialize]
, 那么则会调用其父类的实现。也就是说,父类的+ (void)initialize
可能会被调用多次。`@implementation MyClass //在父类使用 + (void)initialize { if (self == [MyClass class]) { ... } } ... @end
如果类包含分类,且分类重写了
initialize
方法,那么则会调用分类的initialize
实现,而原类的该方法实现不会被调用,这个机制同NSObject
的其他方法(除+ (void)load
方法) 一样,即如果原类同该类的分类包含有相同的方法实现,那么原类的该方法被隐藏而无法被调用。父类的
initialize
方法先于子类的initialize
方法调用。
+load
+ (void)load
会在类或者类的分类添加到 Objective-c runtime 时调用,该调用发生在application:willFinishLaunchingWithOptions:
调用之前调用。父类的
+load
方法先于子类的+load
方法调用,类本身的+load
方法先于分类的+load
方法调用。runtime
调用+load
的时候,程序还没有建立其autorelease pool
,所以那些会需要使用到autorelease pool
的代码,都会出现异常。这一点是非常需要注意的,也就是说放在+(void)load
中的对象都应该是alloc
出来并且不能使用autorelease
来释放。