UIViewController的生命週期

UIViewController中loadView, viewDidLoad, viewWillUnload, viewDidUnload, viewWillAppear, viewDidAppear, viewWillLayoutSubviews,viewDidLayoutSubviews,viewWillDisappear, viewDidDisappear方法,按照調用順序說明如下:

調試日誌:

1. initWithNibName:bundle:

初始化UIViewController,執行關鍵數據初始化操作,注意這裏不要做view相關操作,view在loadView方法中才初始化,這時loadView還未調用。如果使用StoryBoard進行視圖管理,程序不會直接初始化一個UIViewController,StoryBoard會自動初始化或在segue被觸發時自動初始化,因此方法initWithNibName:bundle:不會被調用。如果在代碼裏面使用instantiateViewControllerWithIdentifier:方法顯示初始化一個UIViewController,則initWithCoder方法會被調用。

如果是通過調用initWithNibName:bundle指定nib文件名初始化的話,ViewController會根據此nib來創建View。如果name參數爲nil,則ViewController會通過以下兩個步驟找到與其關聯的nib:
1)如果ViewController的類名以“Controller”結尾,例如ViewController的類名是MyViewController,則查找是否存在MyView.nib;
2)找跟ViewController類名一樣的文件,例如MyViewController,則查找是否存在MyViewController.nib

2. loadView

當訪問UIViewController的view屬性時,view如果此時是nil,那麼VC會自動調用loadView方法來初始化一個UIView並賦值給view屬性。此方法用在初始化關鍵view,需要注意的是,在view初始化之前,不能先調用view的getter方法,否則將導致死循環(除非先調用了[supper loadView];)。

如果沒有重載loadView方法,則UIViewController會從nib或StoryBoard中查找默認的loadView,默認的loadView會返回一個空白的UIView對象。

3. viewDidLoad

當VC的view對象載入內存後調用,用於對view進行額外的初始化操作

4. viewWillAppear

在view即將添加到視圖層級中(顯示給用戶)且任意顯示動畫切換之前調用(這個時候supperView還是nil)。這個方法中完成任何與視圖顯示相關的任務,例如改變視圖方向、狀態欄方向、視圖顯示樣式等

5. viewDidAppear

在view被添加到視圖層級中,顯示動畫切換之後調用(這時view已經添加到supperView中)。在這個方法中執行視圖顯示相關附件任務,如果重載了這個方法,必須在方法中調用[supper viewDidAppear];

6. viewWillLayoutSubviews

view即將佈局其Subviews。比如view的bounds改變了(例如狀態欄從不顯示到顯示,視圖方向變化),要調整Subviews的位置,在調整之前要做的一些工作就可以在該方法中實現。

7. viewDidLayoutSubviews

view已經佈局其Subviews。比如view的bounds改變了(例如狀態欄從不顯示到顯示,視圖方向變化),已經調整Subviews的位置,在調整完成之後要做的一些工作就可以在該方法中實現。

8. viewWillDisappear

view即將從superView中移除且移除動畫切換之前,此時還沒有調用removeFromSuperview。

9. viewDidDisappear

view從superView中移除,移除動畫切換之後調用,此時已調用removeFromSuperview。

10. viewWillUnload

在VC的view對象從內存中釋放之前調用,可以在view被釋放前做一些資源清理操作。在iOS6.0開始就廢棄了,該方法不再會調用

11. viewDidUnload

在VC的view對象從內存中釋放之後調用,可以在view被釋放後做一些view相關的引用清理操作,此時view爲nil。在iOS6.0開始就廢棄了,該方法不再會調用

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章