iOS視圖控制對象生命週期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear的區別及用途

來源:互聯網
上載者:User

標籤:

 

init-初始化程式

viewDidLoad-載入視圖

viewWillAppear-UIViewController對象的視圖即將加入視窗時調用;

viewDidApper-UIViewController對象的視圖已經加入到視窗時調用;

viewWillDisappear-UIViewController對象的視圖即將消失、被覆蓋或是隱藏時調用;

viewDidDisappear-UIViewController對象的視圖已經消失、被覆蓋或是隱藏時調用;

viewVillUnload-當記憶體過低時,需要釋放一些不需要使用的視圖時,即將釋放時調用;

viewDidUnload-當記憶體過低,釋放一些不需要的視圖時調用。

 

        視圖控制對象通過alloc和init來建立,但是視圖控制對象不會在建立的那一刻就馬上建立相應的視圖,而是等到需要使用的時候才通過調用loadView來建立,這樣的做法能提高記憶體的使用率。比如,當某個標籤有很多UIViewController對象,那麼對於任何一個UIViewController對象的視圖,只有相應的標籤被選中時才會被建立出來。

比如如下代碼:

[plain] view plaincopy
  1. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil  
  2. {  
  3.     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];  
  4.     if (self) {  
  5.         // Custom initialization  
  6.         UITabBarItem *tbi = [self tabBarItem];  
  7.         [tbi setTitle:@"CurrentTime"];  
  8.         [[self view ] setBackgroundColor:[UIColor yellowColor]];  
  9.         }  
  10.     return self;  
  11. }  

 

我們將UIViewController的init方法中訪問的執行個體變數view在init中將背景設定為黃色,運行程式,我們能發現背景的確變成了黃色,但是,在我們還沒有需要使用視圖的時候,該視圖已經載入好了,在UIViewController的初始方法中訪問執行個體變數view,會導致延遲載入機制失效,這個問題看上去不是很嚴重,但是如果考慮到記憶體過低警告,那麼問題就大了。。。

 

運行程式,選擇模擬器中的硬體->類比記憶體過低警告,我們會發現,原本設定的黃色背景不見了,這是因為,記憶體過低,視圖控制對象會在發出記憶體過低警告時收到didReceiveMemoryWarning訊息,該方法預設實現,檢查視圖控制對象的視圖是否可見,如果不可見,則釋放掉,下次在載入該視圖時就不會執行init方法,而是只執行viewDidLoad方法,所以需要將[[selfview ] setBackgroundColor:[UIColoryellowColor]];放到viewDidLoad中,這樣如果視圖因為記憶體過低被釋放掉了,下次需要使用到該視圖的時候,程式會預設取執行該視圖的viewDidLoad方法,這樣背景顏色就又出來了。

 

init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear的執行順序:

 從程式的log來看:

2012-10-19 15:51:44.811inHyron[483:b903] init

2012-10-19 15:51:54.081inHyron[483:b903] viewDidLoad

2012-10-19 15:51:54.082inHyron[483:b903] viewVillAppear

2012-10-19 15:51:54.084 inHyron[483:b903] viewDidAppear

很明顯,先執行init、然後執行viewDidLoad,然後是viewWillAppear最後是viewDidAppear,這樣視圖就建立好了,當視圖消失或者被覆蓋的時候:

2012-10-19 15:54:14.557inHyron[483:b903] viewWillDisappear

2012-10-19 15:54:14.558inHyron[483:b903] viewDidDisappear

這樣一來視圖就消失了,當類比記憶體警告的時候:

2012-10-19 15:55:14.333inHyron[483:b903] Received simulated memory warning.

2012-10-19 15:55:14.334inHyron[483:b903] viewWillUnload

2012-10-19 15:55:14.335 inHyron[483:b903]viewDidUnload

從log可以看出,當視圖控制對象收到記憶體警告的時候,程式會執行viewWillUnload最後是執行viewDidUnload。

這樣,一套的流程就完成了,不知道寫的是否詳細。。。。

 

iOS視圖控制對象生命週期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear的區別及用途

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.