简介
在iOS中,对象可分为类对象和实例对象,实例对象即我们平时alloc init初始化的一个具体的对象,实例对象所属的类,称为类对象。类对象、实例对象
+initialize 是一个类方法,在iOS中NSObject以及子类的都有这个方法。
+ (void)initialize;
它是一个类方法,而且还是一个初始化方法。它是用来初始化类对象的方法。和初始化实例对象一样,是一个初始化方法:
我们可以在类里面复写此方法,但是一般我们不需要这么做,因为系统会自动帮我们初始化类对象,当该类收到第一个消息的时候。initialize
+ (void)initialize
{
if (self == [super class]) {
NSLog(@"%s",__func__);
}
}
作用
initialize的存在是很有必要的。
一般的在iOS中我们调用某个类的实例方法,或者类方法,实现都会是以runtime消息转发的形式进行的。当一个类收到第一条消息的时候,会判断该类的类对象是否已经被初始化,如果否则会先执行+ (void)initialize这个初始化方法初始化一个该类的对象,即类对象。
类对象中保存中该类的成员成员变量、实例方法表等与该类相关的信息。这样我们在使用该类的实例对象的时候,就可以通过实例对象的isa指针找到对应的类对象,从而找到想要使用的方法或者成员变量等信息。这就是为什么要初始化类对象的目的,也就是+ (void)initialize方法存在的合理性所在。
initialize每个类仅被调用一次。
注意
initialize是线程安全的
运行时initialize以线程安全的方式将消息发送给类。也就是说,initialize由第一个线程运行以将消息发送给类,而其他任何尝试向该类发送消息的线程都将阻塞,直到initialize完成。
因为initialize是以阻塞的方式调用的,所以在这个方法中建议不要做太多其他处理,这也是我们平时不建议复写initialize的原因所在。
如果非要在initialize里做处理,建议在load方法中去处理。