1. 程式人生 > >UIViewController的生命週期及iOS程式執行順序

UIViewController的生命週期及iOS程式執行順序

當一個檢視控制器被建立,並在螢幕上顯示的時候。 程式碼的執行順序
1、 alloc                                   建立物件,分配空間
2、init (initWithNibName) 初始化物件,初始化資料
3、loadView                          從nib載入檢視 ,通常這一步不需要去幹涉。除非你沒有使用xib檔案建立檢視
4、viewDidLoad                   載入完成,可以進行自定義資料以及動態建立其他控制元件
5、viewWillAppear              檢視將出現在螢幕之前,馬上這個檢視就會被展現在螢幕上了
6、viewDidAppear               檢視已在螢幕上渲染完成

當一個檢視被移除螢幕並且銷燬的時候的執行順序,這個順序差不多和上面的相反
1、viewWillDisappear            檢視將被從螢幕上移除之前執行
2、viewDidDisappear             檢視已經被從螢幕上移除,使用者看不到這個檢視了
3、dealloc                                 檢視被銷燬,此處需要對你在init和viewDidLoad中建立的物件進行釋放

關於viewDidUnload :在發生記憶體警告的時候如果本檢視不是當前螢幕上正在顯示的檢視的話, viewDidUnload將會被執行,本檢視的所有子檢視將被銷燬,以釋放記憶體,此時開發者需要手動對viewLoad、viewDidLoad中建立的物件釋放記憶體。 因為當這個檢視再次顯示在螢幕上的時候,viewLoad、viewDidLoad 再次被呼叫,以便再次構造檢視。

當我們建立一個UIViewController類的物件時,通常系統會生成幾個預設的方法,這些方法大多與檢視的呼叫有關,但是在檢視呼叫時,這些方法的呼叫順序如何,需要整理下。

通常上述方法包括如下幾種,這些方法都是UIViewController類的方法:

- (void)viewDidLoad;

- (void)viewDidUnload;

- (void)viewWillAppear:(BOOL)animated;

- (void)viewDidAppear:(BOOL)animated;

- (void)viewWillDisappear:(BOOL)animated;

- (void)viewDidDisappear:(BOOL)animated;

下面介紹下APP在執行時的呼叫順序。

1)- (void)viewDidLoad;

      一個APP在載入時會先通過呼叫loadView方法或者載入IB中建立的初始介面的方法,將檢視載入到記憶體中。然後會呼叫viewDidLoad方法來進行進一步的設定。通常,我們對於各種初始資料的載入,初始設定等很多內容,都會在這個方法中實現,所以這個方法是一個很常用,很重要的方法。

      但是要注意,這個方法只會在APP剛開始載入的時候呼叫一次,以後都不會再呼叫它了,所以只能用來做初始設定。

2) - (void)viewDidUnload;

      在記憶體足夠的情況下,軟體的檢視通常會一直儲存在記憶體中,但是如果記憶體不夠,一些沒有正在顯示的viewcontroller就會收到記憶體不夠的警告,然後就會釋放自己擁有的檢視,以達到釋放記憶體的目的。但是系統只會釋放記憶體,並不會釋放物件的所有權,所以通常我們需要在這裡將不需要在記憶體中保留的物件釋放所有權,也就是將其指標置為nil。

      這個方法通常並不會在檢視變換的時候被呼叫,而只會在系統退出或者收到記憶體警告的時候才會被呼叫。但是由於我們需要保證在收到記憶體警告的時候能夠對其作出反應,所以這個方法通常我們都需要去實現。

另外,即使在裝置上按了Home鍵之後,系統也不一定會呼叫這個方法,因為IOS4之後,系統允許將APP在後臺掛起,並將其繼續滯留在記憶體中,因此,viewcontroller並不會呼叫這個方法來清除記憶體。

3)- (void)viewWillAppear:(BOOL)animated;

      系統在載入所有資料後,將會在螢幕上顯示檢視,這時會先呼叫這個方法。通常我們會利用這個方法,對即將顯示的檢視做進一步的設定。例如,我們可以利用這個方法來設定裝置不同方向時該如何顯示。

      另外一方面,當APP有多個檢視時,在檢視間切換時,並不會再次載入viewDidLoad方法,所以如果在調入檢視時,需要對資料做更新,就只能在這個方法內實現了。所以這個方法也非常常用。

4) - (void)viewDidAppear:(BOOL)animated;

      有時候,由於一些特殊的原因,我們不能在viewWillApper方法裡,對檢視進行更新。那麼可以重寫這個方法,在這裡對正在顯示的檢視進行進一步的設定。

5) - (void)viewWillDisappear:(BOOL)animated;

      在檢視變換時,當前檢視在即將被移除、或者被覆蓋時,會呼叫這個方法進行一些善後的處理和設定。

      由於在IOS4之後,系統允許將APP在後臺掛起,所以在按了Home鍵之後,系統並不會呼叫這個方法,因為就這個APP本身而言,APP顯示的view,仍是掛起時候的view,所以並不會呼叫這個方法。

6) - (void)viewDidDisappear:(BOOL)animated;

      我們可以重寫這個方法,對已經消失,或者被覆蓋,或者已經隱藏了的檢視做一些其他操作。

上述方法的流程圖可以簡單用如下表示:

執行APP —> 載入檢視 —> 呼叫viewDidLoad方法 —> 呼叫viewWillAppear方法 —> 呼叫viewDidAppear方法 —>   正常執行 

aaaaaaaa                                                                                          A                                                                            | 

aaaaaaaa                                                                                          |                                                                             | 

aaaaaaaa                                                                                          | 載入新的View                                                          | 

aaaaaaaa                                                                                          |                                                                             | 

aaaaaaaa                                                                                          |                                                                             V

釋放物件所有權 <— 呼叫viewDidUnload <— 收到記憶體警告 <— 呼叫viewDidDisappear <— 呼叫viewWillDisappear <—  APP需要呼叫另一個view

IOS程式啟動執行順序