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

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