1.什么時(shí)候被調(diào)用
類或者分類一旦被加載到運(yùn)行時(shí)牙甫,就會(huì)調(diào)用這個(gè)方法。具體的調(diào)用邏輯如下:
objc的的初始化方法 _objc_init中 狭郑,最后一行 _dyld_objc_notify_register(&map_images, load_images, unmap_image);注冊(cè)了一個(gè)通知腹暖, 收到這個(gè)通知就會(huì)調(diào)用load_images(加載模塊)方法。
判斷哪些類和類目實(shí)現(xiàn)了load方法翰萨,這里有兩個(gè)存儲(chǔ)實(shí)現(xiàn)了load方法的類和類目的數(shù)組脏答,這個(gè)查找步驟的順序是按照先編譯先加載的順序,如果類有父類實(shí)現(xiàn)了load方法,就先把父類添加進(jìn)去殖告,所以你會(huì)看到父類的load方法會(huì)在子類之前阿蝶。然后繼續(xù)按照先編譯先加載的順序查找實(shí)現(xiàn)了load方法的類目。到這里準(zhǔn)備工作就做完了黄绩。
在上邊這兩個(gè)方法中筑煮,就是對(duì)之前提到的兩個(gè)數(shù)組循環(huán),調(diào)用他們的load方法粤蝎。這里有一點(diǎn)要說的是load方法的調(diào)用方式真仲,是找到load方法的地址,通過地址來調(diào)用的這個(gè)load方法初澎,并非通過消息發(fā)送objc_msgsend秸应,這就解釋了為什么分類的load方法不會(huì)覆蓋類的load方法了。
2.load中能寫super么碑宴?
只能說不需要寫软啼,load方法是系統(tǒng)自動(dòng)加載的,如果你實(shí)現(xiàn)了延柠,那么每個(gè)類或者類目會(huì)自動(dòng)調(diào)用一次祸挪,調(diào)用super后那么父類的load方法就會(huì)多執(zhí)行一次,至于是否存在影響捕仔,要看你具體是寫了什么匕积。
3.load執(zhí)行幾次?
每個(gè)類或者類目會(huì)自動(dòng)調(diào)用一次
4.load的使用場(chǎng)景榜跌,什么時(shí)候自己寫load方法
最多的使用場(chǎng)景就是方法交換method - swizzling
5.一個(gè)類和他分類(Category)的load方法的執(zhí)行順序
- 類先執(zhí)行其load方法闪唆,然后再執(zhí)行其類目的load方法。
- 多個(gè)類中實(shí)現(xiàn)了load方法钓葫,那么執(zhí)行順序和compile sources(編譯資源)的順序有關(guān)
- 多個(gè)類目中實(shí)現(xiàn)了load方法悄蕾,那么執(zhí)行順序和compile sources(編譯資源)的順序有關(guān)
6.load和 initialize方法的區(qū)別
- 二者最大的區(qū)別就是load是通過函數(shù)指針調(diào)用的,initialize是通過objc_msgSend消息傳遞調(diào)用的础浮。
- 如果分類實(shí)現(xiàn)了+initialize帆调,會(huì)覆蓋類本身的+initialize調(diào)用。
- 如果子類沒有實(shí)現(xiàn)+initialize方法豆同,會(huì)調(diào)用父類的+initialize(所以父類的+initialize方法可能會(huì)被調(diào)用多次)
7.分類(Category)中的load方法能覆蓋本類中的load么番刊?
不會(huì)覆蓋,但是如果對(duì)相同的方法都做過處理影锈,會(huì)因?yàn)檎{(diào)用順序而有所影響芹务。
8.load方法的調(diào)用特點(diǎn)
- 當(dāng)父類和子類都實(shí)現(xiàn)load函數(shù)時(shí),父類的load方法執(zhí)行順序要優(yōu)先于子類
- 當(dāng)子類未實(shí)現(xiàn)load方法時(shí),不會(huì)調(diào)用父類load方法(不會(huì)調(diào)用super)
- 類中的load方法執(zhí)行順序要優(yōu)先于類別(Category)
- 當(dāng)有多個(gè)類別(Category)都實(shí)現(xiàn)了load方法,這幾個(gè)load方法都會(huì)執(zhí)行,但執(zhí)行順序不確定(其執(zhí)行順序與類別在Compile Sources中出現(xiàn)的順序一致)
-
當(dāng)然當(dāng)有多個(gè)不同的類的時(shí)候,每個(gè)類load 執(zhí)行順序與其在Compile Sources出現(xiàn)的順序一致
【當(dāng)父類和子類都實(shí)現(xiàn)load函數(shù)時(shí),父類的load方法執(zhí)行順序要優(yōu)先于子類】 在向數(shù)組添加實(shí)現(xiàn)了load方法的類的時(shí)候用了一個(gè)遞歸來判斷的蝉绷,如果一個(gè)類實(shí)現(xiàn)了load方法 那么判斷他的父類有沒有實(shí)現(xiàn),如果有則將其父類的load方法添加到數(shù)組中枣抱,然后再添加當(dāng)前類的load方法到數(shù)組中