iOS開發之loadView、viewDidLoad及viewDidUnload的關係

來源:互聯網
上載者:User

標籤:分享圖片   尋找   視圖   add   bsp   pre   tle   ios   應該   

標題中所說的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檔案
[[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil];
  • 如果沒有明顯地傳xib檔案名稱,就會載入跟UIViewController同名的xib檔案
[[MJViewController alloc] init]; // 載入MJViewController.xib

2> 如果沒有找到相關聯的xib檔案,就會建立一個空白的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>中敘述的內容

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

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

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

 如果想通過代碼來建立UIViewController的view,就要重寫loadView方法,並且不需要調用[super loadView],因為在第3點裡面已經提到:若沒有xib檔案,[super loadView]預設會建立一個空白的UIView。我們既然要通過代碼來自訂UIView,那麼就沒必要事先建立一個空白的UIView,以節省不必要的開銷。正確的做法應該是這樣:

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中添加一些子視圖、從資料庫或者網路載入模型資料裝配到子視圖中。例如:

1 - (void)viewDidLoad2 {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.什麼時候被調用?

iOS裝置的記憶體是極其有限的,如果應用程式佔用的記憶體過多的話,系統就會對應用程式發出記憶體警告。UIViewController就會收到didReceiveMemoryWarning訊息。didReceiveMemoryWarning方法的預設實現是:如果當前UIViewController的view不在應用程式的視圖階層(View Hierarchy)中,即view的superview為nil的時候,就會將view釋放,並且調用viewDidUnload方法

2.有什麼作用?

上面說到,發出記憶體警告且view被釋放的時候就會調用viewDidUnload方法,所以一般在釋放資源,主要是釋放介面元素相關的資源,將相關的執行個體都賦值為nil

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

iOS開發之loadView、viewDidLoad及viewDidUnload的關係

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.