學(xué)習(xí)推薦如下鏈接:http://www.reibang.com/p/9368ce9bb8f9
Objective-C 有兩個(gè)神奇的方法:+load 和 +initialize,這兩個(gè)方法在類被使用時(shí)會(huì)自動(dòng)調(diào)用。但是兩個(gè)方法的不同點(diǎn)會(huì)導(dǎo)致應(yīng)用層面上性能的顯著差異均牢。
一侧漓、+ initialize 方法和+load 調(diào)用時(shí)機(jī)
首先說(shuō)一下 + initialize 方法:蘋果官方對(duì)這個(gè)方法有這樣的一段描述:這個(gè)方法會(huì)在第一次初始化這個(gè)類之前被調(diào)用,我們用它來(lái)初始化靜態(tài)變量驾霜。
load 方法會(huì)在加載類的時(shí)候就被調(diào)用赶盔,也就是 ios 應(yīng)用啟動(dòng)的時(shí)候斤程,就會(huì)加載所有的類荸恕,就會(huì)調(diào)用每個(gè)類的 + load 方法乖酬。
運(yùn)行程序,我們看一下輸出日志:
2015-10-2715:21:07.545initialize[11637:334237] +[Person load]2015-10-2715:21:07.546initialize[11637:334237] +[Girl load]2015-10-2715:21:07.546initialize[11637:334237] main
這說(shuō)明在我并沒(méi)有對(duì)類做任何操作的情況下融求,+load 方法會(huì)被默認(rèn)執(zhí)行剑刑,并且是在 main 函數(shù)之前執(zhí)行的。
接下來(lái)我們來(lái)查看一下+ initialize方法双肤,先在 ViewController 中創(chuàng)建 Person 和 Girl 對(duì)象:
下面我們來(lái)看一下輸出日志:
2015-10-2715:33:56.195initialize[11711:342410] +[Person load]2015-10-2715:33:56.196initialize[11711:342410] +[Girl load]2015-10-2715:33:56.197initialize[11711:342410] main2015-10-2715:33:56.259initialize[11711:342410] +[Person initialize] Person2015-10-2715:33:56.259initialize[11711:342410] -[Person init]2015-10-2715:33:56.259initialize[11711:342410] -[Person init]2015-10-2715:33:56.259initialize[11711:342410] +[Girl initialize]2015-10-2715:33:56.260initialize[11711:342410] -[Girl init]2015-10-2715:33:56.260initialize[11711:342410] -[Girl init]
通過(guò)這個(gè)實(shí)驗(yàn)我們可以確定兩點(diǎn):
+ initialize方法類似一個(gè)懶加載施掏,如果沒(méi)有使用這個(gè)類,那么系統(tǒng)默認(rèn)不會(huì)去調(diào)用這個(gè)方法茅糜,且默認(rèn)只加載一次七芭;
+ initialize的調(diào)用發(fā)生在 +init 方法之前。
接下來(lái)再探究一下+ initialize在父類與子類之間的關(guān)系蔑赘,創(chuàng)建一個(gè)繼承自 Person 類的 Son類:
看一下輸出日志:
2015-10-2715:44:55.762initialize[12024:351576] +[Person load]2015-10-2715:44:55.764initialize[12024:351576] +[Son load]2015-10-2715:44:55.764initialize[12024:351576] +[Girl load]2015-10-2715:44:55.764initialize[12024:351576] main2015-10-2715:44:55.825initialize[12024:351576] +[Person initialize] Person2015-10-2715:44:55.825initialize[12024:351576] -[Person init]2015-10-2715:44:55.825initialize[12024:351576] -[Person init]2015-10-2715:44:55.826initialize[12024:351576] +[Person initialize] Son2015-10-2715:44:55.826initialize[12024:351576] -[Person init]
我們會(huì)發(fā)現(xiàn) Person 類的+ initialize方法又被調(diào)用了狸驳,但是查看一下是子類 Son 調(diào)用的,也就是創(chuàng)建子類的時(shí)候缩赛,子類會(huì)去調(diào)用父類的+ initialize方法耙箍。
二、總結(jié)
如果你實(shí)現(xiàn)了+ load方法酥馍,那么當(dāng)類被加載時(shí)它會(huì)自動(dòng)被調(diào)用辩昆。這個(gè)調(diào)用非常早。如果你實(shí)現(xiàn)了一個(gè)應(yīng)用或框架的+ load旨袒,并且你的應(yīng)用鏈接到這個(gè)框架上了汁针,那么+ load會(huì)在 main() 函數(shù)之前被調(diào)用。如果你在一個(gè)可加載的 bundle 中實(shí)現(xiàn)了+ load砚尽,那么它會(huì)在 bundle 加載的過(guò)程中被調(diào)用施无。
+ initialize方法的調(diào)用看起來(lái)會(huì)更合理,通常在它里面寫代碼比在+ load里寫更好必孤。+ initialize很有趣猾骡,因?yàn)樗菓姓{(diào)用的,也有可能完全不被調(diào)用敷搪。類第一次被加載時(shí)兴想,
+ initialize不會(huì)被調(diào)用。類接收消息時(shí)购啄,運(yùn)行時(shí)會(huì)先檢查+ initialize有沒(méi)有被調(diào)用過(guò)襟企。如果沒(méi)有嘱么,會(huì)在消息被處理前調(diào)用狮含。