1. 程式人生 > >iOS檢視控制物件生命週期: init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear的區別

iOS檢視控制物件生命週期: init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear的區別

iOS檢視控制物件生命週期:

init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear的區別及用途

init-初始化程式

viewDidLoad-載入檢視

viewWillAppear-UIViewController物件的檢視即將加入視窗時呼叫;

viewDidApper-UIViewController物件的檢視已經加入到視窗時呼叫;

viewWillDisappear-UIViewController物件的檢視即將消失、被覆蓋或是隱藏時呼叫;

viewDidDisappear

-UIViewController物件的檢視已經消失、被覆蓋或是隱藏時呼叫;

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

viewDidUnload-當記憶體過低,釋放一些不需要的檢視時呼叫。

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

比如如下程式碼:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        UITabBarItem *tbi = [self tabBarItem];
        [tbi setTitle:@"CurrentTime"];
        [[self view ] setBackgroundColor:[UIColor yellowColor]];
        }
    return self;
}

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

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

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

 從程式的log來看:

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

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

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

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

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

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

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

這樣一來檢視就消失了,當模擬記憶體警告的時候:

2012-10-1915:55:14.333inHyron[483:b903] Received simulated memorywarning.

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

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

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

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