Load 和 initialize 方法

load:
當(dāng)類被引用進(jìn)程序的時(shí)候會(huì)執(zhí)行這個(gè)函數(shù)。
在一個(gè)程序開始運(yùn)行之前(在main函數(shù)開始執(zhí)行之前),在庫(kù)開始被程序加載怎顾,load函數(shù)就會(huì)開始被執(zhí)行秦陋。
我們開發(fā)的程序都可以認(rèn)為是一個(gè)庫(kù)滋早,但是庫(kù)又不會(huì)獨(dú)立存在(我們的程序還會(huì)引用其他庫(kù)恳守,也可能被其他函數(shù)引用)考婴,所以庫(kù)的初始化順序可以如下:

1初始化我們引用的庫(kù)
2執(zhí)行我們自己庫(kù)的Objective-C的load函數(shù)
3執(zhí)行C++和C的static初始化變量
4初始化引用我們庫(kù)的其他庫(kù)

當(dāng)父類和子類都實(shí)現(xiàn)load函數(shù)時(shí),父類的load函數(shù)會(huì)被先執(zhí)行催烘。load函數(shù)是系統(tǒng)自動(dòng)加載的沥阱,因此不需要調(diào)用父類的load函數(shù),否則父類的load函數(shù)會(huì)多次執(zhí)行伊群。
在Category中寫load函數(shù)是不會(huì)替換原始類中的load函數(shù)的喳钟,原始類和Category中的load函數(shù)都會(huì)被執(zhí)行,原始類的load會(huì)先被執(zhí)行在岂,再執(zhí)行Category中的load函數(shù)。當(dāng)有多個(gè)Category都實(shí)現(xiàn)了load函數(shù)蛮寂,這幾個(gè)load函數(shù)執(zhí)行順序不確定蔽午。

initialize:
當(dāng)類第一次被執(zhí)行到的時(shí)候這個(gè)函數(shù)會(huì)被執(zhí)行。
如果類包含繼承關(guān)系酬蹋,父類的initialize函數(shù)會(huì)比子類先執(zhí)行及老。由于是系統(tǒng)自動(dòng)調(diào)用,也不需要顯式的調(diào)用父類的initialize范抓,否則父類的initialize會(huì)被多次執(zhí)行骄恶。
假如這個(gè)類放到代碼中,而這段代碼并沒有被執(zhí)行匕垫,這個(gè)函數(shù)是不會(huì)被執(zhí)行的僧鲁。

總結(jié):
1.將針對(duì)于類修改放在intialize中,將針對(duì)Category的修改放在load中象泵。
2.但是假如我們是修改系統(tǒng)的類寞秃,一般會(huì)通過(guò)添加Category來(lái)添加功能,但是如果修改initialize會(huì)導(dǎo)致原生的intialize不會(huì)執(zhí)行偶惠,所以放在load中會(huì)比較妥當(dāng)春寿。
3.在加載階段,如果類實(shí)現(xiàn)了load方法忽孽,那么系統(tǒng)就會(huì)調(diào)用它绑改,分類里也可以調(diào)用此方法,類的load方法要比分類的load方法先執(zhí)行兄一。與其他方法不同厘线,load方法不參與覆寫機(jī)制;
4.首次使用某個(gè)類之前出革,系統(tǒng)會(huì)向其發(fā)送initialize消息皆的。由于此方法遵循普通的覆寫規(guī)則,所以通常應(yīng)該在里面判斷當(dāng)前要初始化的是哪個(gè)類蹋盆;
5.load與initialize都應(yīng)該實(shí)現(xiàn)得精簡(jiǎn)费薄,有助于保持程序的響應(yīng)能力硝全;
6.無(wú)法在編譯期設(shè)定的全局變量,可以放在initialize方法中初始化楞抡。

iOS的load方法與initialize方法
load
Invoked whenever a class or category is added to the Objective-C runtime; implement this method to perform class-specific behavior upon loading.

當(dāng)類(Class)或者類別(Category)加入Runtime中時(shí)(就是被引用的時(shí)候)伟众。
實(shí)現(xiàn)該方法,可以在加載時(shí)做一些類特有的操作召廷。

Discussion
The load message is sent to classes and categories that are both dynamically loaded and statically linked, but only if the newly loaded class or category implements a method that can respond.

The order of initialization is as follows:

All initializers in any framework you link to.
調(diào)用所有的Framework中的初始化方法

All +load methods in your image.
調(diào)用所有的+load方法

All C++ static initializers and C/C++ attribute(constructor) functions in your image.
調(diào)用C++的靜態(tài)初始化方及C/C++中的attribute(constructor)函數(shù)

All initializers in frameworks that link to you.
調(diào)用所有鏈接到目標(biāo)文件的framework中的初始化方法

In addition:

A class’s +load method is called after all of its superclasses’ +load methods.
一個(gè)類的+load方法在其父類的+load方法后調(diào)用

A category +load method is called after the class’s own +load method.
一個(gè)Category的+load方法在被其擴(kuò)展的類的自有+load方法后調(diào)用

In a custom implementation of load you can therefore safely message other unrelated classes from the same image, but any load methods implemented by those classes may not have run yet.
在+load方法中凳厢,可以安全地向同一二進(jìn)制包中的其它無(wú)關(guān)的類發(fā)送消息,但接收消息的類中的+load方法可能尚未被調(diào)用竞慢。

initialize
Initializes the class before it receives its first message.

在這個(gè)類接收第一條消息之前調(diào)用先紫。

Discussion
The runtime sends initialize to each class in a program exactly one time just before the class, or any class that inherits from it, is sent its first message from within the program. (Thus the method may never be invoked if the class is not used.) The runtime sends the initialize message to classes in a thread-safe manner. Superclasses receive this message before their subclasses.

Runtime在一個(gè)程序中每一個(gè)類的一個(gè)程序中發(fā)送一個(gè)初始化一次,或是從它繼承的任何類中筹煮,都是在程序中發(fā)送第一條消息遮精。(因此,當(dāng)該類不使用時(shí)败潦,該方法可能永遠(yuǎn)不會(huì)被調(diào)用本冲。)運(yùn)行時(shí)發(fā)送一個(gè)線程安全的方式初始化消息。父類的調(diào)用一定在子類之前劫扒。

對(duì)比 +(void)load +(void)initialize
執(zhí)行時(shí)機(jī) 程序運(yùn)行后檬洞,main函數(shù)之前 類第一次使用的時(shí)候
執(zhí)行次數(shù) 1 1
是否沿用父類

對(duì)比
相同點(diǎn)
在不考慮開發(fā)者主動(dòng)使用的情況下,系統(tǒng)最多會(huì)調(diào)用一次
如果父類和子類都被調(diào)用沟饥,父類的調(diào)用一定在子類之前添怔,
類中的方法優(yōu)先于類別(Category)中的方法。
都是為了應(yīng)用運(yùn)行提前創(chuàng)建合適的運(yùn)行環(huán)境
在使用時(shí)都不要過(guò)重地依賴于這兩個(gè)方法贤旷,除非真正必要
不同點(diǎn)
load是只要類所在文件被引用就會(huì)被調(diào)用(這里是引用進(jìn)項(xiàng)目澎灸,不是被其他的文件引用),而initialize是在類或者其子類的第一個(gè)方法被調(diào)用前調(diào)用遮晚。所以如果類沒有被引用進(jìn)項(xiàng)目性昭,就不會(huì)有l(wèi)oad調(diào)用;但即使類文件被引用進(jìn)來(lái)县遣,但是沒有使用糜颠,那么initialize也不會(huì)被調(diào)用。

對(duì)比 +(void)load +(void)initialize
執(zhí)行時(shí)機(jī) 程序運(yùn)行后萧求,main函數(shù)之前 類第一次使用的時(shí)候
執(zhí)行次數(shù) 1 1
是否沿用父類
對(duì)比 +(void)load +(void)initialize
執(zhí)行時(shí)機(jī) right-aligned $1600
執(zhí)行次數(shù) 1 1
是否沿用父類

參考資料:
iOS類重要的兩個(gè)方法 load 和 initialize
http://blog.csdn.net/hncsy403/article/details/53768540
apple官網(wǎng) load和initialize說(shuō)明
https://developer.apple.com/reference/objectivec/nsobject/1418639-initialize?language=objc
iOS的load方法與initialize方法
http://www.reibang.com/p/65da302fc62c
細(xì)說(shuō)OC中的load和initialize方法
http://www.reibang.com/p/d25f691f0b07
OC中類的load和initialize方法
http://blog.csdn.net/u014084081/article/details/48265453
Objective C類方法load和initialize的區(qū)別
http://www.cnblogs.com/ider/archive/2012/09/29/objective_c_load_vs_initialize.html
NSObject的load和initialize方法 (大神制作)
http://www.molotang.com/articles/1929.html
Objective-C 中 +load 與 +initialize
http://justsee.iteye.com/blog/1630979

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末其兴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子夸政,更是在濱河造成了極大的恐慌元旬,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異匀归,居然都是意外死亡坑资,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門穆端,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)袱贮,“玉大人,你說(shuō)我怎么就攤上這事体啰≡芪。” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵荒勇,是天一觀的道長(zhǎng)柒莉。 經(jīng)常有香客問我,道長(zhǎng)沽翔,這世上最難降的妖魔是什么兢孝? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮搀擂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘卷玉。我一直安慰自己哨颂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布相种。 她就那樣靜靜地躺著威恼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寝并。 梳的紋絲不亂的頭發(fā)上箫措,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音衬潦,去河邊找鬼斤蔓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛镀岛,可吹牛的內(nèi)容都是我干的弦牡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼漂羊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼驾锰!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起走越,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤椭豫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赏酥,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喳整,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了今缚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片算柳。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖姓言,靈堂內(nèi)的尸體忽然破棺而出瞬项,到底是詐尸還是另有隱情,我是刑警寧澤何荚,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布囱淋,位于F島的核電站,受9級(jí)特大地震影響餐塘,放射性物質(zhì)發(fā)生泄漏妥衣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一戒傻、第九天 我趴在偏房一處隱蔽的房頂上張望税手。 院中可真熱鬧,春花似錦需纳、人聲如沸芦倒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)兵扬。三九已至,卻和暖如春口蝠,著一層夾襖步出監(jiān)牢的瞬間器钟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工妙蔗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留傲霸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓眉反,卻偏偏與公主長(zhǎng)得像狞谱,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子禁漓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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