12.11 +(void)load方法詳解

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(加載模塊)方法。

image.png
首先做調(diào)用load方法的準(zhǔn)備工作:
判斷哪些類和類目實(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)備工作就做完了黄绩。
image.png
image.png
然后是調(diào)用call_load_methods方法羡洁。首先執(zhí)行所有類的load方法是 call_class_loads();都調(diào)用完之后,執(zhí)行所有類目的load方法是 call_category_loads() , 所以類目的load方法在類之后來執(zhí)行的爽丹。
image.png

在上邊這兩個(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方法了。
image.png
image.png

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)的順序一致


    image.png

    【當(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ù)組中

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末熔吗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子佳晶,更是在濱河造成了極大的恐慌桅狠,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轿秧,死亡現(xiàn)場(chǎng)離奇詭異中跌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)淤刃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門晒他,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逸贾,你說我怎么就攤上這事〗蛑停” “怎么了铝侵?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長触徐。 經(jīng)常有香客問我咪鲜,道長,這世上最難降的妖魔是什么撞鹉? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任疟丙,我火速辦了婚禮,結(jié)果婚禮上鸟雏,老公的妹妹穿的比我還像新娘享郊。我一直安慰自己,他們只是感情好孝鹊,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布炊琉。 她就那樣靜靜地躺著,像睡著了一般又活。 火紅的嫁衣襯著肌膚如雪苔咪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天柳骄,我揣著相機(jī)與錄音团赏,去河邊找鬼。 笑死耐薯,一個(gè)胖子當(dāng)著我的面吹牛舔清,可吹牛的內(nèi)容都是我干的隘世。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼鸠踪,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼丙者!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起营密,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤械媒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后评汰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纷捞,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年被去,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了主儡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惨缆,死狀恐怖糜值,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坯墨,我是刑警寧澤寂汇,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站捣染,受9級(jí)特大地震影響骄瓣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜耍攘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一榕栏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蕾各,春花似錦扒磁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至检访,卻和暖如春始鱼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背脆贵。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工医清, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卖氨。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓会烙,卻偏偏與公主長得像负懦,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柏腻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345