运行时在类或从它继承的任何类从程序中发送第一条消息之前,向程序中的每个类发送initialize。超类在其子类之前接收此消息。
运行时以线程安全的方式向类发送初始化消息。也就是说,initialize由第一个线程运行以向类发送消息,任何其他尝试向该类发送消息的线程都将阻塞,直到initialize完成。
如果子类没有实现初始化,则可以多次调用超类实现运行时将调用继承的实现,或者如果子类显式调用[super initialize]。如果您想保护自己不被多次运行,您可以按照以下思路构建实现:
+ (void)initialize {
if(self== [ClassNameself]) {
// ... do the initialization ...
}
}
因为initialize是以阻塞方式调用的,所以将方法实现限制到尽可能少的工作量是很重要的。具体地说,任何接受其他类在初始化方法中可能需要的锁的代码都可能导致死锁。因此,您不应该依赖initialize进行复杂的初始化,而应该将其限制为直接的类本地初始化。
网友评论