loadView,viewDidLoad熊锭,viewDidUnload等都是一個UIViewController生命周期中的一部分句旱,文中會詳細(xì)解釋loadView的調(diào)用機制和作用并闡述三者關(guān)系惑惶。
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文件
[[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]; ?
//?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] ;??
如果想通過代碼來創(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)該是這樣:
-?(void)loadView?{ ?
?????self.view?=?[[UIWebView?alloc]?initWithFrame:[UIScreen?mainScreen].applicationFrame]; ?
} ?
不需要調(diào)用[super loadView]袍镀,你調(diào)用了也不會出錯默蚌,只是造成了一些不必要的開銷。
總結(jié)一句話流椒,蘋果設(shè)計這個方法就是給我們自定義UIViewController的view用的
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方法進行界面元素的初始化
轉(zhuǎn)載自https://blog.csdn.net/q199109106q/article/details/8614044/