【iOS知識學習】_視圖控制對象生命週期-init、viewDidLoad、viewWillAppe

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

init-初始化程序spa

viewDidLoad-加載視圖.net

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

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

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

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

viewVillUnload-當內存太低時,須要釋放一些不須要使用的視圖時,即將釋放時調用;內存

viewDidUnload-當內存太低,釋放一些不須要的視圖時調用。get

  

        視圖控制對象經過alloc和init來建立,可是視圖控制對象不會在建立的那一刻就立刻建立相應的視圖,而是等到須要使用的時候才經過調用loadView來建立,這樣的作法能提升內存的使用率。好比,當某個標籤有不少UIViewController對象,那麼對於任何一個UIViewController對象的視圖,只有相應的標籤被選中時纔會被建立出來。it

好比以下代碼:

[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。

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

 

還有看的不明白的,能夠取下個人小Demo: http://download.csdn.net/detail/weasleyqi/4664799,在CurrentTimeViewController.m當中詳細的log都寫好了,你們能夠取研究研究。

相關文章
相關標籤/搜索