回顧ios中UIViewController的生命週期及ios的執行順序

         之前經過一個月的學習我將ios的ui基礎學習完,發現之前的知識有點朦朧,所以想一點一點的回顧一下之前學習的知識,正所謂溫故而之心嘛,首先說一下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方法 —>   正常運行

IOS 開發 loadView 和 viewDidLoad 的區別

iPhone開發必不可少的要用到這兩個方法。 他們都可以用來在視圖載入的時候,初始化一些內容。 但是他們有什麼區別呢?

viewDidLoad 此方法只有當view從nib文件初始化的時候才被調用。

loadView 此方法在控制器的view爲nil的時候被調用。 此方法用於以編程的方式創建view的時候用到。 如: 

- ( void ) loadView {

    UIView *view = [ [ UIView alloc] initWithFrame:[ UIScreen

     mainScreen] .applicationFrame] ;

   [ view setBackgroundColor:_color] ;

   self.view = view;

   [ view release] ;} 

你在控制器中實現了loadView方法,那麼你可能會在應用運行的某個時候被內存管理控制調用。 如果設備內存不足的時候, view 控制器會收到didReceiveMemoryWarning的消息。 默認的實現是檢查當前控制器的view是否在使用。如果它的view不在當前正在使用的view hierarchy裏面,且你的控制器實現了loadView方法,那麼這個view將被release, loadView方法將被再次調用來創建一個新的view。

 

下面是轉載的高手寫的

一、UIViewController的初始化

  初始化時會根據需要調用init,initWithCoder等相關函數,這個時候我們可以做一下簡單的初始化操作,建立ViewController中需要使用的數據模型等,不建議在初始化階段就直接創建view及其他與顯示有關的對象(應該放到loadView的時候去創建,或者採用懶加載的方法創建)。

  我們都知道ViewController可以通過代碼和xib兩種方式創建,這兩種方式的初始化流程也不盡相同。

  1)使用xib創建的VC

  xib其實最終是會把我們的設置保存成一個數據集(xml文件),當需要初始化構建VC的時候,回去讀取記錄的數據集,然後幫我們動態的創建VC,因此可以想象它在初始化時會先去找看是否實現initWithCoder方法,如果該類實現了該方法,就直接調用initWithCoder方法創建對象,如果沒有實現的話就調用init方法。調用完初始化方法以後緊接着會調用awakeFromNib方法,在這個方法裏面我們可以做進一步的初始化操作。

  2)使用代碼創建VC

  使用代碼創建時,我們根據需要手動的創建VC中的數據,如果自己定製VC時,還需要在init中調用[super init]

二、UIViewController中View的load和unload

前面講了不建議在VC初始化的時候就創建view及其他與顯示相關的代碼,官方文檔建議將View的初始化操作放到loadView的時候再做,當VC接到內存告警時會調用didRecieveMemoryWarning這個時候我們就要做出響應,釋放暫時不需要的對象。如果無視這個警告,系統內存不夠用時會會繼續發送,如果還得不到處理就會強制退出程序。下面看具體的loadView和unloadView時候都會做什麼操作。

  1)Load週期

load cycle

  當需要顯示或者訪問view屬性時,view沒有創建的話,VC就會調用loadView方法,在這個時候會創建一個view並將其賦給VC.view屬性。緊接着就會調用VC的viewDidLoad方法,這個時候VC.view保證是有值的,可以做進一步的初始化操作,例如添加一些subview。注意:定製VC時,如果覆蓋loadView方法,不需要調用[super loadView]方法。

  2)Unload週期

  當app收到內存警告的時候,會調用每一個VC的didRecieveMemoryWarning方法,我們需要做出響應,釋放程序中暫時不需要的資源。通常都會重寫該方法,重寫時候需要調用super的該方法。如果檢測到當前VC的view可以被安全釋放的話,就會調用viewWillUnload方法,這個我們必須要重視,因爲當VC的view消失時候它的subviews可能會被一起釋放,我們需要根據具體情況做一些記錄,以保證下次能夠正確創建,同時不出現內存泄漏。調用viewWillUnload以後,會將VC.view屬性設置成nil,然後在調用viewDidUnload方法,這個時候我們可以釋放那些強引用的對象。




發佈了17 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章