【分享】UIViewController生命週期簡單概括

1、調用順序:app

1. + (id)alloc 分配內存;佈局

2. - (id)init 方法(包括其餘-(id)init...方法),只容許調用一次,而且要與 alloc方法 寫在一塊兒,在init方法中申請的內存,要在dealloc方法中釋放(或者其餘地方);spa

3. - (void)awakeFromNib 使用Xib初始化後會調用此方法,通常不會重寫此方法;設計

4. - (void)loadView 若是使用Xib建立ViewController,就不要重寫該方法。通常不會修改此方法;視頻

 

5. - (void)viewDidLoad 視圖加載完成以後被調用,這個方法很重要,能夠在此增長一些本身定義的控件,注意此時view的frame不必定是顯示時候的frame,真實的frame會在 - (void)viewDidAppear: 後。
在iOS6.0+版本中在對象的整個生命週期中只會被調用一次,
這裏要注意在iOS3.0~iOS5.X版本中可能會被重複調用,當ViewController收到內存警告後,會釋放View,並調用viewDidUnload,以後會從新調用viewDidLoad,因此要支持iOS6.0之前版本的童鞋要注意這裏的內存管理。
 
6. - (void)viewWillAppear:( BOOL)animated view 將要顯示的時候,能夠在此加載一些圖片,和一些其餘佔內存的資源;
7. - (void)viewDidAppear:( BOOL)animated view 已經顯示的時候;

 

8. - (void)viewWillDisappear:(BOOL)animated view 將要隱藏的時候,能夠在此將一些佔用內存比較大的資源先釋放掉,在 viewWillAppear: 中從新加載。如:圖片/聲音/視頻。若是View已經隱藏而又在內存中保留這些在顯示前不會被調用的資源,那麼App閃退的概率會增長,尤爲是ViewController比較多的時候;對象

9. - (void)viewDidAppear:(BOOL)animated view 已經隱藏的時候;生命週期

10. - (void)dealloc,不要手動調用此方法,當引用計數值爲0的時候,系統會自動調用此方法。圖片



2、使用 NavigationController 去 Push 切換顯示的View的時候,調用的順序:內存

例如 從 A 控制器 Push 顯示 B 控制器,資源

[(A *)self.navigationController pushViewController:B animated:YES]

1. 加載B控制器的View(若是沒有的話);

2. 調用 A 的 - (void)viewWillDisappear:(BOOL)animated;

3. 調用 B 的 - (void)viewWillAppear:(BOOL)animated;

4. 調用 A 的 - (void)viewDidDisappear:(BOOL)animated;

5. 調用 B 的 - (void)viewDidAppear:(BOOL)animated;

總結來講,ViewController 的切換是先調用 隱藏的方法,再調用顯示的方法;先調用Will,再調用Did。

 

3、從新佈局View的子View

 

- (void)viewWillLayoutSubviews

- (void)viewDidLayoutSubviews
看字面意思就知道這兩個方法是在View對他的子View進行佈局的時候會被調用,包括View 顯示/隱藏/屏幕旋轉 的時候都會被調用。

若是設計的應用須要支持多方向能夠在這裏面進行一些UI的橫豎屏適配。

 

打印附錄:

2014-05-04 11:52:03.461 TestLifecycle[3141:60b] [ViewController viewDidLoad]

2014-05-04 11:52:03.463 TestLifecycle[3141:60b] [ViewController viewWillAppear:]

2014-05-04 11:52:03.464 TestLifecycle[3141:60b] [ViewController viewWillLayoutSubviews]

2014-05-04 11:52:03.465 TestLifecycle[3141:60b] [ViewController viewDidLayoutSubviews]

2014-05-04 11:52:03.516 TestLifecycle[3141:60b] [ViewController viewDidAppear:]

#Push一個新的ViewController : TestViewController

2014-05-04 11:52:07.219 TestLifecycle[3141:60b] [ViewController viewWillLayoutSubviews]

2014-05-04 11:52:07.220 TestLifecycle[3141:60b] [ViewController viewDidLayoutSubviews]

2014-05-04 11:52:07.298 TestLifecycle[3141:60b] [TestViewController viewDidLoad]

2014-05-04 11:52:07.299 TestLifecycle[3141:60b] [ViewController viewWillDisappear:]

2014-05-04 11:52:07.299 TestLifecycle[3141:60b] [TestViewController viewWillAppear:]

2014-05-04 11:52:07.303 TestLifecycle[3141:60b] [ViewController viewWillLayoutSubviews]

2014-05-04 11:52:07.303 TestLifecycle[3141:60b] [ViewController viewDidLayoutSubviews]

2014-05-04 11:52:07.304 TestLifecycle[3141:60b] [TestViewController viewWillLayoutSubviews]

2014-05-04 11:52:07.304 TestLifecycle[3141:60b] [TestViewController viewDidLayoutSubviews]

2014-05-04 11:52:07.806 TestLifecycle[3141:60b] [ViewController viewDidDisappear:]

2014-05-04 11:52:07.807 TestLifecycle[3141:60b] [TestViewController viewDidAppear:]

2014-05-04 11:52:07.807 TestLifecycle[3141:60b] [TestViewController viewWillLayoutSubviews]

2014-05-04 11:52:07.808 TestLifecycle[3141:60b] [TestViewController viewDidLayoutSubviews]

#在新的ViewController 中返回

2014-05-04 11:52:10.606 TestLifecycle[3141:60b] [TestViewController viewWillDisappear:]

2014-05-04 11:52:10.606 TestLifecycle[3141:60b] [ViewController viewWillAppear:]

2014-05-04 11:52:11.108 TestLifecycle[3141:60b] [TestViewController viewDidDisappear:]

2014-05-04 11:52:11.109 TestLifecycle[3141:60b] [ViewController viewDidAppear:]

相關文章
相關標籤/搜索