一、调用顺序:
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: 后。
在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的时候,系统会自动调用此方法。
二、使用 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:]