[iOS]UIViewController生命週期簡單歸納
一、呼叫順序:
1. + (id)alloc 分配記憶體;
2. - (id)init 方法(包括其他-(id)init...方法),只允許呼叫一次,並且要與 alloc方法 寫在一起,在init方法中申請的記憶體,要在dealloc方法中釋放(或者其他地方);
3. - (void)awakeFromNib 使用Xib初始化後會呼叫此方法,一般不會重寫此方法;
4. - (void)loadView 如果使用Xib建立ViewController,就不要重寫該方法。一般不會修改此方法;
5. - (void)viewDidLoad 檢視載入完成之後被呼叫,這個方法很重要,可以在此增加一些自己定義的控制元件,注意此時view的frame不一定是顯示時候的frame,真實的frame會在 - (void)viewDidAppear: 後。7. - (void)viewDidAppear:(BOOL)animated view 已經顯示的時候;
8. - (void)viewWillDisappear:(BOOL
9. - (void)viewDidAppear:(BOOL)animated view 已經隱藏的時候;
10. - (void)dealloc,不要手動呼叫此方法,當引用計數值為0的時候,系統會自動呼叫此方法。
二、使用 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。
三、重新佈局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:]