久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

loadView、viewDidLoad及viewDidUnload的關(guān)系

 最初九月雪 2014-12-12

標(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)實(shí)現(xiàn)是怎樣的,?

默認(rèn)實(shí)現(xiàn)即[super loadView]里面做了什么事情,。

1> 它會先去查找與UIViewController相關(guān)聯(lián)的xib文件,通過加載xib文件來創(chuàng)建UIViewController的view

  • 如果在初始化UIViewController指定了xib文件名,,就會根據(jù)傳入的xib文件名加載對應(yīng)的xib文件
    1. [[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil];  
  • 如果沒有明顯地傳xib文件名,,就會加載跟UIViewController同名的xib文件
    1. [[MJViewController alloc] init]; // 加載MJViewController.xib  

2> 如果沒有找到相關(guān)聯(lián)的xib文件,就會創(chuàng)建一個空白的UIView,,然后賦值給UIViewController的view屬性,,大致如下

  1. self.view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];  
  2. // 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,比如:

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

 如果想通過代碼來創(chuàng)建UIViewController的view,,就要重寫loadView方法,,并且不需要調(diào)用[super loadView],因?yàn)樵诘?點(diǎn)里面已經(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];  

viewDidUnload

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

iOS設(shè)備的內(nèi)存是極其有限的,如果應(yīng)用程序占用的內(nèi)存過多的話,,系統(tǒng)就會對應(yīng)用程序發(fā)出內(nèi)存警告,。UIViewController就會收到didReceiveMemoryWarning消息。didReceiveMemoryWarning方法的默認(rèn)實(shí)現(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)的實(shí)例都賦值為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方法進(jìn)行界面元素的初始化

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

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多