+(void)load與+(void)initialize測驗

準備

新建TestObjectModelTestSubObjectModelTestSubObjectModel2噪珊、NSObject+TestCategoryNSObject+TestCategory2五個文件齐莲,其中TestSubObjectModel痢站、TestSubObjectModel2繼承自TestObjectModel

在所有文件中實現(xiàn)+(void)load+(void)initialize方法,并在每個方法中添加NSLog(@"%s", __func__);方便后續(xù)觀察选酗。

先不引用#import任何文件阵难。

+(void)initialize的測驗

此時分類中的+ (void)initialize會報個警告Category is implementing a method which will also be implemented by its primary class,意思是Category正在實現(xiàn)一個方法芒填,該方法也將由其主類實現(xiàn)呜叫。

如果不管這個警告繼續(xù)運行,此時控制臺會輸出一堆的+[NSObject(TestCategory) initialize]殿衰,原因可能是運行過程中很多個NSObject子類生成朱庆,但是都被該分類給攔截了,為了數(shù)據(jù)安全最好不要在Category中實現(xiàn)+(void)initialize方法闷祥。

+(void)load的測驗

移除Category中的+(void)initialize后直接運行娱颊,得到結(jié)果如下:

[TestObjectModel load]  // 父類
[TestSubObjectModel load]  // 子類
[TestSubObjectModel2 load]  // 子類
[NSObject+TestCategory load]  // 分類
[NSObject+TestCategory2 load]  // 分類

此時查看文件編譯順序為:父類>子類>分類


接下來改動一下文件編譯的順序,將其調(diào)整為:子類>分類>父類凯砍,結(jié)果如下:

[TestObjectModel load]  // 父類
[TestSubObjectModel load]  // 子類
[TestSubObjectModel2 load]  // 子類
[NSObject+TestCategory load]  // 分類
[NSObject+TestCategory2 load]  // 分類

然后刪除所有文件箱硕,重新添加并保持添加順序為父類>分類>子類,測試后結(jié)果如下:

[TestObjectModel load]  // 父類
[TestSubObjectModel load]  // 子類
[TestSubObjectModel2 load]  // 子類
[NSObject+TestCategory load]  // 分類
[NSObject+TestCategory2 load]  // 分類

最后將文件編譯順序調(diào)整為TestSubObjectModel2>TestSubObjectModel悟衩、NSObject+TestCategory2>NSObject+TestCategory颅痊,獲得如下結(jié)果:

[TestObjectModel load]  // 父類
[TestSubObjectModel2 load]  // 子類
[TestSubObjectModel load]  // 子類
[NSObject+TestCategory2 load]  // 分類
[NSObject+TestCategory load]  // 分類

經(jīng)測試可以看出:
在編譯階段+(void)load方法調(diào)用順序為父類>子類>分類,當(dāng)同級的多個子類或多個分類的時候局待,按設(shè)置中Compile Sources文件順序進行編譯斑响,在編譯階段+(void)initialize不調(diào)用菱属。

在類及分類中+(void)load方法只加載一次

main函數(shù)中添加NSLog

main.m文件的main函數(shù)中添加打印信息再運行舰罚,結(jié)果如下:
控制臺打印如下:

[TestObjectModel load]  // 父類
[TestSubObjectModel2 load]  // 子類
[TestSubObjectModel load]  // 子類
[NSObject+TestCategory2 load]  // 分類
[NSObject+TestCategory load]  // 分類
main函數(shù)

由此可以看出纽门,+(void)load函數(shù)執(zhí)行于main函數(shù)前,由于main函數(shù)前在啟動APP階段营罢,如果在這個階段前執(zhí)行了耗時操作赏陵,會增加啟動時間,而蘋果在審核的時候要求拒掉啟動時間過長的APP饲漾,因此在+(void)load函數(shù)中盡量少添加代碼蝙搔。

main函數(shù)執(zhí)行前

查資料獲知main函數(shù)執(zhí)行前的流程如下:

  • 系統(tǒng)調(diào)用當(dāng)前APP的進程,初始化運行環(huán)境考传。
  • dyld讀取并加載程序中的mach-o文件動態(tài)庫吃型。
  • 開啟緩存策略,加載程序中鏈接的動態(tài)庫僚楞,如framework勤晚、tbd等。
  • ImageLoader加載所有的image(鏡像)到內(nèi)存泉褐。
  • 當(dāng)前類鏡像的map_images函數(shù)執(zhí)行赐写。
  • 當(dāng)前類鏡像的load_images函數(shù)執(zhí)行,進而觸發(fā)+load方法膜赃。
  • 當(dāng)前類鏡像中所有c++全局靜態(tài)變量和__attribute__修飾的構(gòu)造函數(shù)的初始化挺邀。
  • mian函數(shù)執(zhí)行。

總結(jié)

+(void)load特點:

  • 執(zhí)行順序:先調(diào)父類跳座,再調(diào)子類端铛,最后調(diào)分類,多個子類或分類時按編譯順序調(diào)用躺坟。
  • 執(zhí)行次數(shù):只執(zhí)行一次,子類執(zhí)行自己的+load方法前乳蓄,會先執(zhí)行父類的+load咪橙。
  • 不覆蓋category中的+load不會覆蓋本類中的+load。
  • 繼承規(guī)則特例:如果某類未實現(xiàn)+load虚倒,則不管其父類中是否實現(xiàn)+load美侦,該類本身不會調(diào)用+load
  • 危險性+load函數(shù)在main之前執(zhí)行魂奥,警惕耗時或不安全操作菠剩。
  • 內(nèi)存安全:必要時在+load中自己負責(zé)autorelease

+(void)initialize特點:

  • 不安全
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耻煤,一起剝皮案震驚了整個濱河市具壮,隨后出現(xiàn)的幾起案子准颓,更是在濱河造成了極大的恐慌,老刑警劉巖棺妓,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件攘已,死亡現(xiàn)場離奇詭異,居然都是意外死亡怜跑,警方通過查閱死者的電腦和手機样勃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來性芬,“玉大人峡眶,你說我怎么就攤上這事≈诧保” “怎么了辫樱?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長汽煮。 經(jīng)常有香客問我搏熄,道長,這世上最難降的妖魔是什么暇赤? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任心例,我火速辦了婚禮,結(jié)果婚禮上鞋囊,老公的妹妹穿的比我還像新娘止后。我一直安慰自己,他們只是感情好溜腐,可當(dāng)我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布译株。 她就那樣靜靜地躺著,像睡著了一般挺益。 火紅的嫁衣襯著肌膚如雪歉糜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天望众,我揣著相機與錄音匪补,去河邊找鬼。 笑死烂翰,一個胖子當(dāng)著我的面吹牛夯缺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播甘耿,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼踊兜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了佳恬?” 一聲冷哼從身側(cè)響起捏境,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤于游,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后典蝌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體曙砂,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年骏掀,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸠澈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡截驮,死狀恐怖笑陈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情葵袭,我是刑警寧澤涵妥,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站坡锡,受9級特大地震影響蓬网,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鹉勒,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一帆锋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧禽额,春花似錦锯厢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至藻丢,卻和暖如春剪撬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悠反。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工残黑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人问慎。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓萍摊,卻偏偏與公主長得像挤茄,于是被迫代替她去往敵國和親如叼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容