標(biāo)題中所說的3個(gè)方法,都是UIViewController的方法份招,跟UIViewController的view屬性的生命周期息息相關(guān)。接下來我會(huì)一一闡述它們的作用以及它們之間的聯(lián)系狞甚。
一锁摔、loadView
1.什么時(shí)候被調(diào)用?
每次訪問UIViewController的view(比如controller.view哼审、self.view)而且view為nil谐腰,loadView方法就會(huì)被調(diào)用。
2.有什么作用涩盾?
loadView方法是用來負(fù)責(zé)創(chuàng)建UIViewController的view
3.默認(rèn)實(shí)現(xiàn)是怎樣的十气?
默認(rèn)實(shí)現(xiàn)即[super loadView]里面做了什么事情。
1> 它會(huì)先去查找與UIViewController相關(guān)聯(lián)的xib文件春霍,通過加載xib文件來創(chuàng)建UIViewController的view
如果在初始化UIViewController指定了xib文件名砸西,就會(huì)根據(jù)傳入的xib文件名加載對應(yīng)的xib文件
如果沒有明顯地傳xib文件名,就會(huì)加載跟UIViewController同名的xib文件
2> 如果沒有找到相關(guān)聯(lián)的xib文件,就會(huì)創(chuàng)建一個(gè)空白的UIView芹枷,然后賦值給UIViewController的view屬性衅疙,大致如下
[super loadView]里面就大致完成1>和2>中敘述的內(nèi)容
4.怎樣正確使用這個(gè)方法?
大家都知道UIViewController的view可以通過xib文件來創(chuàng)建鸳慈,但是在某些情況下饱溢,xib不是那么地靈活,所以有時(shí)候我們想通過代碼來創(chuàng)建UIView走芋,比如:
** 如果想通過代碼來創(chuàng)建UIViewController的view绩郎,就要重寫loadView方法,并且不需要調(diào)用[super loadView]翁逞,因?yàn)樵诘?點(diǎn)里面已經(jīng)提到:若沒有xib文件肋杖,[super loadView]默認(rèn)會(huì)創(chuàng)建一個(gè)空白的UIView。我們既然要通過代碼來自定義UIView熄攘,那么就沒必要事先創(chuàng)建一個(gè)空白的UIView兽愤,以節(jié)省不必要的開銷。正確的做法應(yīng)該是這樣:**
不需要調(diào)用[super loadView]挪圾,你調(diào)用了也不會(huì)出錯(cuò)浅萧,只是造成了一些不必要的開銷。
總結(jié)一句話哲思,蘋果設(shè)計(jì)這個(gè)方法就是給我們自定義UIViewController的view用的
二洼畅、viewDidLoad
1.什么時(shí)候被調(diào)用?
無論你是通過xib文件還是重寫loadView方法創(chuàng)建UIViewController的view棚赔,在view創(chuàng)建完畢后帝簇,最終都會(huì)調(diào)用viewDidLoad方法
2.有什么作用?
一般我們會(huì)在這里做界面上的初始化操作靠益,比如往view中添加一些子視圖丧肴、從數(shù)據(jù)庫或者網(wǎng)絡(luò)加載模型數(shù)據(jù)裝配到子視圖中。例如:
三胧后、viewDidUnload
1.什么時(shí)候被調(diào)用芋浮?
iOS設(shè)備的內(nèi)存是極其有限的,如果應(yīng)用程序占用的內(nèi)存過多的話壳快,系統(tǒng)就會(huì)對應(yīng)用程序發(fā)出內(nèi)存警告纸巷。UIViewController就會(huì)收到didReceiveMemoryWarning消息。didReceiveMemoryWarning方法的默認(rèn)實(shí)現(xiàn)是:如果當(dāng)前UIViewController的view不在應(yīng)用程序的視圖層次結(jié)構(gòu)(View Hierarchy)中眶痰,即view的superview為nil的時(shí)候瘤旨,就會(huì)將view釋放,并且調(diào)用viewDidUnload方法
2.有什么作用竖伯?
上面說到存哲,發(fā)出內(nèi)存警告且view被釋放的時(shí)候就會(huì)調(diào)用viewDidUnload方法因宇,所以一般在釋放資源,主要是釋放界面元素相關(guān)的資源宏胯,將相關(guān)的實(shí)例都賦值為nil
3.dealloc也是用來釋放資源的羽嫡,那跟viewDidUnload有什么關(guān)系?
當(dāng)發(fā)出內(nèi)存警告調(diào)用viewDidUnload方法時(shí)肩袍,只是釋放了view,并沒有釋放UIViewController婚惫,所以并不會(huì)調(diào)用dealloc方法氛赐。即viewDidUnload和dealloc方法并沒有任何關(guān)系,dealloc方法只會(huì)在UIViewController被釋放的時(shí)候調(diào)用
四先舷、三個(gè)方法的關(guān)系
1.第一次訪問UIViewController的view時(shí)艰管,view為nil,然后就會(huì)調(diào)用loadView方法創(chuàng)建view
2.view創(chuàng)建完畢后會(huì)調(diào)用viewDidLoad方法進(jìn)行界面元素的初始化
3.當(dāng)內(nèi)存警告時(shí)蒋川,系統(tǒng)可能會(huì)釋放UIViewController的view牲芋,將view賦值為nil,并且調(diào)用viewDidUnload方法
4.當(dāng)再次訪問UIViewController的view時(shí)捺球,view已經(jīng)在3中被賦值為nil缸浦,所以又會(huì)調(diào)用loadView方法重新創(chuàng)建view
5.view被重新創(chuàng)建完畢后,還是會(huì)調(diào)用viewDidLoad方法進(jìn)行界面元素的初始化
VC1 >>push vc2
vc2 diss vc1