oc- +load和+initialize方法的區別

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

查看蘋果的文檔:

+(void)load

  • 調用時機:當一個類或者分類被加入oc的runtime時候會被調用。
    app啟動的時候,會加載所有的類,這個時候會調用所有類和分類的+(void)load方法(調用時機非常靠前,在main函數執行之前)。

  • 需要注意的是

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

+ (void)initialize

  • 調用時機:在類第一次接收到消息的時候。
    runtime會在一個類或者其子類調用第一個方法的時候,給類發送+ (void)initialize消息。
  • 需要注意的是:
    • 父類會先收到消息。(子類調用方法前為了確保父類已經初始化,會先調用父類的)
    • 這個方法的調用是線程安全的。(源碼中有鎖的機制)
    • 如果父類實現這個方法,而子類沒有實現這個方法,父類的方法可能會被調用很多次。(因為繼承關系的原因,如果子類沒有這個方法,就會去調用父類的這個方法)
    • 一個子類只會調用一次
    • 分類如果實現這個方法,會替換調父類的。
    • 盡量避免多個類在這個方法里互相調用方法,不然會形成死鎖。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容