iOS開發(fā)之loadView、viewDidLoad及viewDidUnload的關(guān)系 2018-09-07

標(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文件

[[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]默認(rèn)會創(chuàng)建一個空白的UIView。我們既然要通過代碼來自定義UIView,那么就沒必要事先創(chuàng)建一個空白的UIView,以節(jié)省不必要的開銷。正確的做法應(yīng)該是這樣:

1 - (void)loadView {

2? ? self.view = [[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];

3 }

不需要調(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ù)裝配到子視圖中。例如:

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設(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

1 - (void)viewDidUnload {

2? ? [super viewDidUnload];

3? ? self.name = nil;

4? ? self.pwd = nil;

5 }

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方法進行界面元素的初始化

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 國慶假期與許久未見的朋友小聚了一回。 聚會時,一朋友問我現(xiàn)在在做什么(職位)。我回答了:設(shè)計,偶爾兼顧一些文案工作...
    曦大夫閱讀 260評論 0 1
  • 一輪明月照高樓 天上人間地上憂 手拖月盤笑顏柔 中秋團圓樂悠悠 夫妻恩愛兒女逗 父母盼著絮舊游 舉杯同歡把節(jié)度 遙...
    田萍閱讀 158評論 0 1
  • [1] 回到家時,已是深夜十點半。 最近事情很多,每天都是這個點回到家。雖然付出了大力氣,可結(jié)果并不如意。然而更讓...
    孤舟泛跡閱讀 515評論 0 0
  • (一)什么是 JSPatch JSPatch 是一個開源項目(Github鏈接),只需要在項目里引入極小的引擎文件...
    天空像天空一樣藍閱讀 2,633評論 0 2
  • 七分愛你三分愛己 沒有怕過,唯獨你! 傷疤不會無故發(fā)痛,除非你揭開它。沒有人能傷到你除非你愿意。
    王呼呼和大叔閱讀 329評論 0 0

友情鏈接更多精彩內(nèi)容