load
load 函數(shù)是當(dāng)類或分類(Category)被加載到 Objective-C runtime 時(就是被引用的時候)被調(diào)用的,實現(xiàn)這個方法可以讓我們在類加載的時候執(zhí)行一些類相關(guān)的行為。當(dāng)類被引用進(jìn)項目的時候就會執(zhí)行 load 函數(shù)(在 main 函數(shù)開始執(zhí)行之前),與這個類是否被用到無關(guān),每個類的 load 函數(shù)只會自動調(diào)用一次。load 函數(shù)調(diào)用特點如下:
- 當(dāng)父類和子類都實現(xiàn) load 函數(shù)時,二者的 load 方法都會被調(diào)用,父類的 load 方法執(zhí)行順序要優(yōu)先于子類。
- 當(dāng)子類未實現(xiàn) load 方法時,在加載該子類時,不會去調(diào)用其父類 load 方法。
- 類中的 load 方法執(zhí)行順序要優(yōu)先于類別(Category)。
- 當(dāng)有多個類別(Category)都實現(xiàn)了 load 方法,這幾個 load 方法都會執(zhí)行,但執(zhí)行順序與編譯順序一致,即與類別在 Compile Sources 中出現(xiàn)的順序一致。
- 當(dāng)有多個不同的類的時候,每個類 load 執(zhí)行順序與編譯順序一致,即與其在 Compile Sources 出現(xiàn)的順序一致。
initialize
initialize 函數(shù)是在類或者其子類的收到第一條消息之前調(diào)用。這里所指的消息包括實例方法和類方法的調(diào)用。也就是說 initialize 方法是以懶加載的方式被調(diào)用的,如果程序一直沒有給某個類或它的子類發(fā)送消息,那么這個類的 initialize 方法是永遠(yuǎn)不會被調(diào)用的。
- 父類的 initialize 方法會比子類先執(zhí)行。
- 當(dāng)子類未實現(xiàn) initialize 方法時,在該子類收到第一條消息之前,會調(diào)用父類 initialize 方法,子類實現(xiàn) initialize 方法時,則會覆蓋父類 initialize 方法。有點多態(tài)的意思。
- 當(dāng)有多個 Category 都實現(xiàn)了 initialize 方法,會覆蓋類中的方法,只執(zhí)行最后那個被編譯的,即 Compile Sources 列表中最后一個 Category 的 initialize 方法。
對于 load 和 initialize 方法,我們不要顯示的調(diào)用 super 的對應(yīng)方法。