iOS类对象的初始化+initialize

简介

在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方法中去处理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章