? ? ?以下的方法作為每為ios開發(fā)工作者,肯定很熟悉,但有時(shí)又容易混淆,我對(duì)這些方法做了歸納總結(jié),有一部分是從網(wǎng)上找的,感覺不錯(cuò)就記下了.
一、loadView
永遠(yuǎn)不要主動(dòng)調(diào)用這個(gè)函數(shù)芥挣。view controller會(huì)在view的property被請(qǐng)求并且當(dāng)前view值為nil時(shí)調(diào)用這個(gè)函數(shù)。如果你手動(dòng)創(chuàng)建view剂碴,你應(yīng)該重載這個(gè)函數(shù),且不要在重載的時(shí)候調(diào)用[super loadview]虹茶。如果你用IB創(chuàng)建view并初始化view
controller,那就意味著你使用initWithNibName:bundle:方法朱灿,這時(shí)续扔,你不應(yīng)該重載loadView函數(shù)攻臀。
這個(gè)方法系統(tǒng)的默認(rèn)實(shí)現(xiàn)是這樣:
1;尋找有關(guān)可用的nib文件的信息,根據(jù)這個(gè)信息來加載nib文件//所以纱昧,nib的加載過程是在loadview中完成的哦刨啸。
2;如果沒有有關(guān)nib文件的信息,默認(rèn)創(chuàng)建一個(gè)空白的UIView對(duì)象识脆,然后把對(duì)象成賦值給viewcontroller的主view设联。
所以,如果你決定重載這個(gè)函數(shù)時(shí)灼捂,你也應(yīng)該完成這些步驟:
把子類的view賦給view屬性(property)(你create的view必須是唯一的實(shí)例离例,并且不被其他任何controller共享),而且你重載的這個(gè)函數(shù)不應(yīng)該調(diào)用super悉稠,這個(gè)也是為了保持主view與controller的單一映射關(guān)系宫蛆。
二、viewDidLoad
這個(gè)函數(shù)在controller加載了相關(guān)的views后被調(diào)用的猛,而不論這些views存儲(chǔ)在nib文件里還是在loadView函數(shù)中生成耀盗。
這個(gè)函數(shù)的作用主要是讓你可以進(jìn)一步的初始化你的views。viewDidLoad通常負(fù)責(zé)的是view及其子view被加載進(jìn)內(nèi)存之后的數(shù)據(jù)初始化的工作卦尊,即視圖的數(shù)據(jù)部分的初始化叛拷。在iOS 3.0以及更高版本中,你應(yīng)該重載viewDidUnload函數(shù)來釋放任何對(duì)view的引用或者它里面的內(nèi)容(子view等等)岂却。
其多數(shù)情況下是做nib文件的后續(xù)工作忿薇。
三、viewDidUnload
這個(gè)函數(shù)是viewDidLoad的對(duì)立函數(shù)淌友。在程序內(nèi)存欠缺時(shí)煌恢,這個(gè)函數(shù)被controller調(diào)用骇陈,來釋放它的view以及view相關(guān)的對(duì)象震庭。由于controller通常保存著view以及相關(guān)object的引用,所以你必須使用這個(gè)函數(shù)來放棄這些對(duì)象的所有權(quán)以便內(nèi)存回收你雌。但不要釋放那些難以重建的數(shù)據(jù)器联。
通常controller會(huì)保存nib文件建立的views的引用二汛,但是也可能會(huì)保存著loadView函數(shù)創(chuàng)建的對(duì)象的引用。最完美的方法是使用合成器方法:
1
self.myCertainView
2
=
nil;
這樣合成器會(huì)release這個(gè)view拨拓,如果你沒有使用property肴颊,那么你得自己顯式釋放這個(gè)view。
四渣磷、結(jié)論
所以流程應(yīng)該是這樣:
loadView來加載view(無論nib文件或自定義的views)到內(nèi)存——>viewDidLoad函數(shù)進(jìn)一步初始化這些view(通常是側(cè)重于數(shù)據(jù)data的初始化)——>內(nèi)存不足時(shí)婿着,調(diào)用viewDidUnload函數(shù)釋放views
—->當(dāng)需要使用view時(shí)又回到第一步
如此循環(huán)
需要厘清兩個(gè)概念,創(chuàng)建一個(gè)類和實(shí)例化一個(gè)類.在XCode中創(chuàng)建一個(gè)類和實(shí)例化一個(gè)類很容易區(qū)分,但是在IB(Interface Builder)中有時(shí)候就會(huì)迷糊.其實(shí)也很好區(qū)分,孤零零地創(chuàng)建了一個(gè)nib文件,沒有和其他可被實(shí)例化的類有直接或間接關(guān)系的時(shí)候,這個(gè)類或這些類(一個(gè)nib文件也可能包含多個(gè)類)是沒有機(jī)會(huì)被實(shí)例化的,所以這種情況只是通過ib創(chuàng)建了一個(gè)類,而沒有實(shí)例化.真正的實(shí)例化還需要通過在Xcode用代碼來讀取這個(gè)nib文件.知道這兩這的區(qū)別后這些方法也就容易辨認(rèn)多了
viewDidLoad其實(shí)沒什么可混淆的,無論通過什么途徑加載(Xcode或者IB,這里的加載屬于實(shí)例化)完view后肯定會(huì)執(zhí)行這個(gè)方法.
loadView需要分兩種情況.當(dāng)你通過Xcode實(shí)例化一個(gè)類的時(shí)候就需要自己在controller中實(shí)現(xiàn)這個(gè)方法.而在IB中實(shí)例化就不需要實(shí)現(xiàn)它.
initWithNibName這個(gè)方法是在controller的類在IB中創(chuàng)建,但是通過Xcode實(shí)例化controller的時(shí)候用的.
initWithCoder是一個(gè)類在IB中創(chuàng)建但在xocdde中被實(shí)例化時(shí)被調(diào)用的.比如,通過IB創(chuàng)建一個(gè)controller的nib文件,然后在xcode中通過initWithNibName來實(shí)例化這個(gè)controller,那么這個(gè)controller的initWithCoder會(huì)被調(diào)用.
awakeFromNib
當(dāng).nib文件被加載的時(shí)候,會(huì)發(fā)送一個(gè)awakeFromNib的消息到.nib文件中的每個(gè)對(duì)象醋界,每個(gè)對(duì)象都可以定義自己的awakeFromNib函數(shù)來響應(yīng)這個(gè)消息竟宋,執(zhí)行一些必要的操作。也就是說通過nib文件創(chuàng)建view對(duì)象時(shí)執(zhí)行awakeFromNib
viewDidLoad
當(dāng)view對(duì)象被加載到內(nèi)存后就會(huì)執(zhí)行viewDidLoad形纺,所以不管通過nib文件還是代碼的方式創(chuàng)建對(duì)象都會(huì)執(zhí)行viewDidLoad丘侠。