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