+(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)用方法,不然會形成死鎖。