日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

loadView、viewDidLoad及viewDidUnload的关系

發(fā)布時(shí)間:2023/12/29 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 loadView、viewDidLoad及viewDidUnload的关系 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

標(biāo)題中所說(shuō)的3個(gè)方法,都是UIViewController的方法,跟UIViewController的view屬性的生命周期息息相關(guān)。接下來(lái)我會(huì)一一闡述它們的作用以及它們之間的聯(lián)系。

一、loadView

1.什么時(shí)候被調(diào)用?

每次訪問(wèn)UIViewController的view(比如controller.view、self.view)而且view為nil,loadView方法就會(huì)被調(diào)用。

?

2.有什么作用??

loadView方法是用來(lái)負(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文件,通過(guò)加載xib文件來(lái)創(chuàng)建UIViewController的view,

如果在初始化UIViewController指定了xib文件名,就會(huì)根據(jù)傳入的xib文件名加載對(duì)應(yīng)的xib文件

[[ViewController alloc]initWithNibName:@"ViewController" bundle:nil];?

如果沒(méi)有明顯地傳xib文件名,就會(huì)加載跟UIViewController同名的xib文件

[[ViewController alloc] init]; //?加載ViewController.xib?

2>?如果沒(méi)有找到相關(guān)聯(lián)的xib文件,就會(huì)創(chuàng)建一個(gè)空白的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.怎樣正確使用這個(gè)方法?

大家都知道UIViewController的view可以通過(guò)xib文件來(lái)創(chuàng)建,但是在某些情況下,xib不是那么地靈活,所以有時(shí)候我們想通過(guò)代碼來(lái)創(chuàng)建UIView,比如:

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

如 果想通過(guò)代碼來(lái)創(chuàng)建UIViewController的view,就要重寫(xiě)loadView方法,并且不需要調(diào)用[superloadView],因?yàn)樵?第3點(diǎn)里面已經(jīng)提到:若沒(méi)有xib文件,[super loadView]默認(rèn)會(huì)創(chuàng)建一個(gè)空白的UIView。我們既然要通過(guò)代碼來(lái)自定義UIView,那么就沒(méi)必要事先創(chuàng)建一個(gè)空白的UIView,以節(jié)省不 必要的開(kāi)銷(xiāo)。正確的做法應(yīng)該是這樣:

- (void)loadView

{?

  self.view = [[[UIWebView alloc] initWithFrame:[UIScreenmainScreen].applicationFrame] autorelease];?

}?

不需要調(diào)用[super loadView],你調(diào)用了也不會(huì)出錯(cuò),只是造成了一些不必要的開(kāi)銷(xiāo)。

總結(jié)一句話,蘋(píng)果設(shè)計(jì)這個(gè)方法就是給我們自定義UIViewController的view用的。

?

二、viewDidLoad

?

1.什么時(shí)候被調(diào)用?

不管你是通過(guò)xib文件還是重寫(xiě)loadView創(chuàng)建UIViewController的view,在view創(chuàng)建完畢后,最終都會(huì)調(diào)用viewDidLoad方法。

?

2.有什么作用?

一般我們會(huì)在這里做界面上的初始化操作,比如往view中添加一些子視圖、從數(shù)據(jù)庫(kù)或者網(wǎng)絡(luò)加載模型數(shù)據(jù)裝配到子視圖中。例如:

- (void)viewDidLoad?

{

  [super viewDidLoad];?

? ? ? ?//?添加一個(gè)按鈕?

  UIButton *button = [UIButtonbuttonWithType:UIButtonTypeContactAdd];?

  [button addTarget:self action:@selector(click)forControlEvents:UIControlEventTouchUpInside];?

  [self.view addSubview:button];?

}

三、viewDidUnload

?

1.什么時(shí)候被調(diào)用??

iOS 設(shè)備的內(nèi)存是極其有限的,如果應(yīng)用程序占用的內(nèi)存過(guò)多的話,系統(tǒng)就會(huì)對(duì)應(yīng)用程序發(fā)出內(nèi)存警告。UIViewController就會(huì)收到 didReceiveMemoryWarning消息。didReceiveMemoryWarning方法的默認(rèn)實(shí)現(xiàn)是:如果當(dāng)前 UIViewController的view不在應(yīng)用程序的視圖層次結(jié)構(gòu)(ViewHierarchy)中,即view的superview為nil的時(shí) 候,就會(huì)將view釋放,并且調(diào)用viewDidUnload方法。

?

2.有什么作用?

上面說(shuō)到,發(fā)出內(nèi)存警告且view被釋放的時(shí)候就會(huì)調(diào)用viewDidUnload方法,所以一般在釋放資源,主要是釋放界面元素相關(guān)的資源,將相關(guān)的實(shí)例都賦值為nil。

- (void)viewDidUnload

{?

  [super viewDidUnload];?

  self.name = nil;?

  self.pwd = nil;?

}?

?

3.dealloc也是用來(lái)釋放資源的,那跟viewDidUnload有什么關(guān)系?

當(dāng) 發(fā)出內(nèi)存警告調(diào)用viewDidUnload方法時(shí),只是釋放了view,并沒(méi)有釋放UIViewController,所以并不會(huì)調(diào)用dealloc方 法。即viewDidUnload和dealloc方法并沒(méi)有任何關(guān)系,dealloc方法只會(huì)在UIViewController被釋放的時(shí)候調(diào)用。

?

四、三個(gè)方法的關(guān)系

?

1.第一次訪問(wèn)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)再次訪問(wèn)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)行界面元素的初始化。

轉(zhuǎn)載于:https://www.cnblogs.com/feife/p/4630301.html

總結(jié)

以上是生活随笔為你收集整理的loadView、viewDidLoad及viewDidUnload的关系的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。