標題中所說的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方法是用來負責創(chuàng)建UIViewController的view
3.默認實現(xiàn)是怎樣的者祖?
默認實現(xiàn)即[super loadView]里面做了什么事情立莉。
1> 它會先去查找與UIViewController相關(guān)聯(lián)的xib文件,通過加載xib文件來創(chuàng)建UIViewController的view
如果在初始化UIViewController指定了xib文件名七问,就會根據(jù)傳入的xib文件名加載對應的xib文件
[[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil];
如果沒有明顯地傳xib文件名蜓耻,就會加載跟UIViewController同名的xib文件
[[MJViewController alloc] init]; // 加載MJViewController.xib
2> 如果沒有找到相關(guān)聯(lián)的xib文件,就會創(chuàng)建一個空白的UIView械巡,然后賦值給UIViewController的view屬性刹淌,大致如下
self.view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];
// applicationFrame的值是:{{x = 0, y = 20}, {width = 320, height = 460}}
[super loadView]里面就大致完成1>和2>中敘述的內(nèi)容
4.怎樣正確使用這個方法?
大家都知道UIViewController的view可以通過xib文件來創(chuàng)建讥耗,但是在某些情況下有勾,xib不是那么地靈活,所以有時候我們想通過代碼來創(chuàng)建UIView古程,比如:
self.view = [[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];
?如果想通過代碼來創(chuàng)建UIViewController的view蔼卡,就要重寫loadView方法,并且不需要調(diào)用[super
loadView]挣磨,因為在第3點里面已經(jīng)提到:若沒有xib文件雇逞,[super
loadView]默認會創(chuàng)建一個空白的UIView。我們既然要通過代碼來自定義UIView茁裙,那么就沒必要事先創(chuàng)建一個空白的UIView塘砸,以節(jié)省不必要的開銷。正確的做法應該是這樣:
1 - (void)loadView {
2? ? self.view = [[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];
3 }
不需要調(diào)用[super loadView]晤锥,你調(diào)用了也不會出錯掉蔬,只是造成了一些不必要的開銷。
總結(jié)一句話查近,蘋果設計這個方法就是給我們自定義UIViewController的view用的
?
二眉踱、viewDidLoad
1.什么時候被調(diào)用?
無論你是通過xib文件還是重寫loadView方法創(chuàng)建UIViewController的view霜威,在view創(chuàng)建完畢后谈喳,最終都會調(diào)用viewDidLoad方法
2.有什么作用?
一般我們會在這里做界面上的初始化操作戈泼,比如往view中添加一些子視圖婿禽、從數(shù)據(jù)庫或者網(wǎng)絡加載模型數(shù)據(jù)裝配到子視圖中。例如:
1 - (void)viewDidLoad
2 {
3? ? [super viewDidLoad];
4? ?
5? ? // 添加一個按鈕
6? ? UIButton *button = [UIButton buttonWithType:UIButtonTypeContactAdd];
7? ? [button addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];
8? ? [self.view addSubview:button];
9 }
?
三大猛、viewDidUnload
1.什么時候被調(diào)用扭倾?
iOS設備的內(nèi)存是極其有限的,如果應用程序占用的內(nèi)存過多的話挽绩,系統(tǒng)就會對應用程序發(fā)出內(nèi)存警告膛壹。UIViewController就會收到didReceiveMemoryWarning消息。didReceiveMemoryWarning方法的默認實現(xiàn)是:如果當前UIViewController的view不在應用程序的視圖層次結(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
1 - (void)viewDidUnload {
2? ? [super viewDidUnload];
3? ? self.name = nil;
4? ? self.pwd = nil;
5 }
3.dealloc也是用來釋放資源的工窍,那跟viewDidUnload有什么關(guān)系?
當發(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.當內(nèi)存警告時取试,系統(tǒng)可能會釋放UIViewController的view悬槽,將view賦值為nil,并且調(diào)用viewDidUnload方法
4.當再次訪問UIViewController的view時瞬浓,view已經(jīng)在3中被賦值為nil初婆,所以又會調(diào)用loadView方法重新創(chuàng)建view
5.view被重新創(chuàng)建完畢后,還是會調(diào)用viewDidLoad方法進行界面元素的初始化