標(biāo)題中所說的3個方法,都是UIViewController的方法四敞,跟UIViewController的view屬性的生命周期息息相關(guān)。接下來我會一一闡述它們的作用以及它們之間的聯(lián)系拔妥。
一忿危、loadView
1.什么時候被調(diào)用?
每次訪問UIViewController的view(比如controller.view没龙、self.view)而且view為nil铺厨,loadView方法就會被調(diào)用。
2.有什么作用硬纤?
loadView方法是用來負(fù)責(zé)創(chuàng)建UIViewController的view
3.默認(rèn)實現(xiàn)是怎樣的解滓?
默認(rèn)實現(xiàn)即[super loadView]里面做了什么事情。
1> 它會先去查找與UIViewController相關(guān)聯(lián)的xib文件筝家,通過加載xib文件來創(chuàng)建UIViewController的view
如果在初始化UIViewController指定了xib文件名洼裤,就會根據(jù)傳入的xib文件名加載對應(yīng)的xib文件
如果沒有明顯地傳xib文件名,就會加載跟UIViewController同名的xib文件
2> 如果沒有找到相關(guān)聯(lián)的xib文件溪王,就會創(chuàng)建一個空白的UIView腮鞍,然后賦值給UIViewController的view屬性,大致如下
[super loadView]里面就大致完成1>和2>中敘述的內(nèi)容
4.怎樣正確使用這個方法在扰?
大家都知道UIViewController的view可以通過xib文件來創(chuàng)建缕减,但是在某些情況下雷客,xib不是那么地靈活芒珠,所以有時候我們想通過代碼來創(chuàng)建UIView,比如:
** 如果想通過代碼來創(chuàng)建UIViewController的view搅裙,就要重寫loadView方法皱卓,并且不需要調(diào)用[super loadView]裹芝,因為在第3點里面已經(jīng)提到:若沒有xib文件,[super loadView]默認(rèn)會創(chuàng)建一個空白的UIView娜汁。我們既然要通過代碼來自定義UIView嫂易,那么就沒必要事先創(chuàng)建一個空白的UIView,以節(jié)省不必要的開銷掐禁。正確的做法應(yīng)該是這樣:**
不需要調(diào)用[super loadView]怜械,你調(diào)用了也不會出錯,只是造成了一些不必要的開銷傅事。
總結(jié)一句話缕允,蘋果設(shè)計這個方法就是給我們自定義UIViewController的view用的
二、viewDidLoad
1.什么時候被調(diào)用蹭越?
無論你是通過xib文件還是重寫loadView方法創(chuàng)建UIViewController的view障本,在view創(chuàng)建完畢后,最終都會調(diào)用viewDidLoad方法
2.有什么作用响鹃?
一般我們會在這里做界面上的初始化操作驾霜,比如往view中添加一些子視圖、從數(shù)據(jù)庫或者網(wǎng)絡(luò)加載模型數(shù)據(jù)裝配到子視圖中买置。例如:
三粪糙、viewDidUnload
1.什么時候被調(diào)用?
iOS設(shè)備的內(nèi)存是極其有限的堕义,如果應(yīng)用程序占用的內(nèi)存過多的話猜旬,系統(tǒng)就會對應(yīng)用程序發(fā)出內(nèi)存警告。UIViewController就會收到didReceiveMemoryWarning消息倦卖。didReceiveMemoryWarning方法的默認(rèn)實現(xiàn)是:如果當(dāng)前UIViewController的view不在應(yīng)用程序的視圖層次結(jié)構(gòu)(View Hierarchy)中洒擦,即view的superview為nil的時候,就會將view釋放怕膛,并且調(diào)用viewDidUnload方法
2.有什么作用熟嫩?
上面說到,發(fā)出內(nèi)存警告且view被釋放的時候就會調(diào)用viewDidUnload方法褐捻,所以一般在釋放資源掸茅,主要是釋放界面元素相關(guān)的資源,將相關(guān)的實例都賦值為nil
3.dealloc也是用來釋放資源的柠逞,那跟viewDidUnload有什么關(guān)系昧狮?
當(dāng)發(fā)出內(nèi)存警告調(diào)用viewDidUnload方法時,只是釋放了view板壮,并沒有釋放UIViewController逗鸣,所以并不會調(diào)用dealloc方法。即viewDidUnload和dealloc方法并沒有任何關(guān)系,dealloc方法只會在UIViewController被釋放的時候調(diào)用
四撒璧、三個方法的關(guān)系
1.第一次訪問UIViewController的view時透葛,view為nil,然后就會調(diào)用loadView方法創(chuàng)建view
2.view創(chuàng)建完畢后會調(diào)用viewDidLoad方法進行界面元素的初始化
3.當(dāng)內(nèi)存警告時卿樱,系統(tǒng)可能會釋放UIViewController的view僚害,將view賦值為nil,并且調(diào)用viewDidUnload方法
4.當(dāng)再次訪問UIViewController的view時繁调,view已經(jīng)在3中被賦值為nil萨蚕,所以又會調(diào)用loadView方法重新創(chuàng)建view
5.view被重新創(chuàng)建完畢后,還是會調(diào)用viewDidLoad方法進行界面元素的初始化