+(void)load
和+ (void)initialize
都是NSObject的類方法。
查看蘋果的文檔:
+(void)load
調用時機:當一個類或者分類被加入oc的runtime時候會被調用。
app啟動的時候,會加載所有的類,這個時候會調用所有類和分類的+(void)load
方法(調用時機非常靠前,在main函數執行之前)。-
需要注意的是
- 當一個類和它的子類以及分類都實現了+(void)load方法,這三個方法都會去調用。調用的順序是:父類->子類->分類
- 子類實現的時候,不需要顯示的去調用父類的load方法。
- 在load方法里可以去調用其他類的方法(雖然其他類的load方法可能還沒有被調用)。
+ (void)initialize
-
調用時機:在類第一次接收到消息的時候。
runtime會在一個類或者其子類調用第一個方法的時候,給類發送+ (void)initialize
消息。 -
需要注意的是:
- 父類會先收到消息。(子類調用方法前為了確保父類已經初始化,會先調用父類的)
- 這個方法的調用是線程安全的。(源碼中有鎖的機制)
- 如果父類實現這個方法,而子類沒有實現這個方法,父類的方法可能會被調用很多次。(因為繼承關系的原因,如果子類沒有這個方法,就會去調用父類的這個方法)
- 一個子類只會調用一次
- 分類如果實現這個方法,會替換調父類的。
- 盡量避免多個類在這個方法里互相調用方法,不然會形成死鎖。