91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

loadView、viewDidLoad及viewDidUnload的關系

發布時間:2020-07-13 00:01:36 來源:網絡 閱讀:434 作者:沐長青 欄目:開發技術

標題中所說的3個方法,都是UIViewController的方法,跟UIViewController的view屬性的生命周期息息相關。接下來我會一一闡述它們的作用以及它們之間的聯系。

loadView

1.什么時候被調用?

每次訪問UIViewController的view(比如controller.view、self.view)而且view為nil,loadView方法就會被調用。

2.有什么作用?

loadView方法是用來負責創建UIViewController的view

3.默認實現是怎樣的?

默認實現即[super loadView]里面做了什么事情。

1> 它會先去查找與UIViewController相關聯的xib文件,通過加載xib文件來創建UIViewController的view

  • 如果在初始化UIViewController指定了xib文件名,就會根據傳入的xib文件名加載對應的xib文件

    [java] view plaincopy

  1. [[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil];  

  • 如果沒有明顯地傳xib文件名,就會加載跟UIViewController同名的xib文件

    [java] view plaincopy

  1. [[MJViewController alloc] init]; // 加載MJViewController.xib  

2> 如果沒有找到相關聯的xib文件,就會創建一個空白的UIView,然后賦值給UIViewController的view屬性,大致如下

[java] view plaincopy

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

  2. // applicationFrame的值是:{{x = 0, y = 20}, {width = 320, height = 460}}  


[super loadView]里面就大致完成1>和2>中敘述的內容

4.怎樣正確使用這個方法?

大家都知道UIViewController的view可以通過xib文件來創建,但是在某些情況下,xib不是那么地靈活,所以有時候我們想通過代碼來創建UIView,比如:

[java] view plaincopy

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



 如果想通過代碼來創建UIViewController的view,就要重寫loadView方法,并且不需要調用[super loadView],因為在第3點里面已經提到:若沒有xib文件,[super loadView]默認會創建一個空白的UIView。我們既然要通過代碼來自定義UIView,那么就沒必要事先創建一個空白的UIView,以節省不必要的開銷。正確的做法應該是這樣:

[java] view plaincopy

  1. - (void)loadView {  

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

  3. }  


不需要調用[super loadView],你調用了也不會出錯,只是造成了一些不必要的開銷。

總結一句話,蘋果設計這個方法就是給我們自定義UIViewController的view用

 

viewDidLoad

1.什么時候被調用?

不過你是通過xib文件還是重寫loadView創建UIViewController的view,在view創建完畢后,最終都會調用viewDidLoad方法

2.有什么作用?

一般我們會在這里做界面上的初始化操作,比如往view中添加一些子視圖、從數據庫或者網絡加載模型數據裝配到子視圖中。例如:

[java] view plaincopy

  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.什么時候被調用?

iOS設備的內存是極其有限的,如果應用程序占用的內存過多的話,系統就會對應用程序發出內存警告。UIViewController就會收到didReceiveMemoryWarning消息。didReceiveMemoryWarning方法的默認實現是:如果當前UIViewController的view不在應用程序的視圖層次結構(View Hierarchy)中,即view的superview為nil的時候,就會將view釋放,并且調用viewDidUnload方法

2.有什么作用?

上面說到,發出內存警告且view被釋放的時候就會調用viewDidUnload方法,所以一般在釋放資源,主要是釋放界面元素相關的資源,將相關的實例都賦值為nil

[java] view plaincopy

  1. - (void)viewDidUnload {  

  2.     [super viewDidUnload];  

  3.     self.name = nil;  

  4.     self.pwd = nil;  

  5. }  


3.dealloc也是用來釋放資源的,那跟viewDidUnload有什么關系?

當發出內存警告調用viewDidUnload方法時,只是釋放了view,并沒有釋放UIViewController,所以并不會調用dealloc方法。即viewDidUnload和dealloc方法并沒有任何關系,dealloc方法只會在UIViewController被釋放的時候調用

 

三個方法的關系

1.第一次訪問UIViewController的view時,view為nil,然后就會調用loadView方法創建view

2.view創建完畢后會調用viewDidLoad方法進行界面元素的初始化

3.當內存警告時,系統可能會釋放UIViewController的view,將view賦值為nil,并且調用viewDidUnload方法

4.當再次訪問UIViewController的view時,view已經在3中被賦值為nil,所以又會調用loadView方法重新創建view

5.view被重新創建完畢后,還是會調用viewDidLoad方法進行界面元素的初始化


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

毕节市| 团风县| 曲阳县| 南川市| 大方县| 曲沃县| 卢氏县| 奉贤区| 阜新| 茂名市| 富锦市| 寻甸| 依安县| 乌海市| 湘阴县| 北票市| 汉源县| 吕梁市| 鞍山市| 垫江县| 自贡市| 二连浩特市| 商河县| 益阳市| 通城县| 信阳市| 东明县| 贡觉县| 东兴市| 蒙山县| 乌拉特中旗| 长汀县| 辽阳县| 峨眉山市| 定结县| 龙州县| 邹平县| 宜昌市| 盘山县| 开江县| 固阳县|