oc- +load和+initialize方法的區(qū)別

+(void)load+ (void)initialize都是NSObject的類方法。

查看蘋果的文檔:

+(void)load

  • 調(diào)用時機(jī):當(dāng)一個類或者分類被加入oc的runtime時候會被調(diào)用。
    app啟動的時候,會加載所有的類,這個時候會調(diào)用所有類和分類的+(void)load方法(調(diào)用時機(jī)非??壳?,在main函數(shù)執(zhí)行之前)。

  • 需要注意的是

    • 當(dāng)一個類和它的子類以及分類都實現(xiàn)了+(void)load方法,這三個方法都會去調(diào)用。調(diào)用的順序是:父類->子類->分類
    • 子類實現(xiàn)的時候,不需要顯示的去調(diào)用父類的load方法。
    • 在load方法里可以去調(diào)用其他類的方法(雖然其他類的load方法可能還沒有被調(diào)用)。

+ (void)initialize

  • 調(diào)用時機(jī):在類第一次接收到消息的時候。
    runtime會在一個類或者其子類調(diào)用第一個方法的時候,給類發(fā)送+ (void)initialize消息。
  • 需要注意的是:
    • 父類會先收到消息。(子類調(diào)用方法前為了確保父類已經(jīng)初始化,會先調(diào)用父類的)
    • 這個方法的調(diào)用是線程安全的。(源碼中有鎖的機(jī)制)
    • 如果父類實現(xiàn)這個方法,而子類沒有實現(xiàn)這個方法,父類的方法可能會被調(diào)用很多次。(因為繼承關(guān)系的原因,如果子類沒有這個方法,就會去調(diào)用父類的這個方法)
    • 一個子類只會調(diào)用一次
    • 分類如果實現(xiàn)這個方法,會替換調(diào)父類的。
    • 盡量避免多個類在這個方法里互相調(diào)用方法,不然會形成死鎖。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容