所谓控制器的生命周期,无非就是几个方法的调用顺序(如下方法按照顺序执行):
- 加载根视图
/* 加载根视图 */
- (void)loadView {
[super loadView];
//控制器的根视图View是懒加载的;
//加载View,创建View,优先级最高;
//从nib载入视图,通常这一步不需要去干涉。除非你没有使用xib文件创建视图。(在定制 VC 时,如果覆盖loadView方法,不需要调用[super loadView] 方法
//1.如果你要重写loadView,可以自定义一个与系统不一样的View
//2.可以在根视图中添加一些一些子视图
NSLog(@"%s",__FUNCTION__);
}
- 控制器加载完毕的时候
- (void)viewDidLoad {
[super viewDidLoad];
//1.可以为控制器自定义数据,数据加载
//2.动态创建其他控件(同名南昌会在这里做各种初始数据的载入,初始设定等很多内容)
NSLog(@"%s",__FUNCTION__);
}
- 控制器的View即将显示
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
//进行一些显示前的处理,比如键盘弹出,一些特殊过程动画,比如状态栏和* navigationbar*的颜色等
//不会调整初始状态的界面布局;
//在视图要展示出来之前,做些准备操作,约束还没生效;
NSLog(@"%s",__FUNCTION__);
}
在- (void)viewWillAppear:(BOOL)animated 与 - (void)viewDidAppear:(BOOL)animated 之间还要执行两个关键的方法:
- 根视图即将布局子视图
/* 根视图即将布局子视图 */
- (void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
//Subviews的布局调整完毕之前要做的一些事情;
/* 在根视图或者它的子视图的frame值发生改变 */
/* 或者当前屏幕的状态发生改变时调用 */
NSLog(@"%s",__FUNCTION__);
}
- 根视图已经完成子视图的布局
/* 根视图已经完成子视图的布局 */
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
//Subviews的布局调整完毕之后要做的一些事情;
/* 比如,一旦imageView的frame值改变,切圆角的操作就放在这里进行 */
NSLog(@"%s",__FUNCTION__);
}
- 控制器的View已经显示
/* 控制器的View已经显示 */
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
//视图展示出来之后,约束已经生效;
NSLog(@"%s",__FUNCTION__);
}
- 控制器的View即将消失
/* 控制器的View即将消失*/
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
//视图即将从屏幕移除之前执行,此时还没有调用`removeFromSuperview`,视图即将被移除,覆盖时会在这里做一些善后处理和设置
NSLog(@"%s",__FUNCTION__);
}
- 控制器的View已经消失
/* 控制器的View已经消失*/
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
//视图已经从屏幕上移除了,用户看不到这个视图了。此时已调用removeFromSuperview。
//释放一些不再需要的资源,与UI显示有关的资源
NSLog(@"%s",__FUNCTION__);
}
- 接收到内存警告
/* 接收到内存警告 */
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
NSLog(@"%s",__FUNCTION__);
}
过时的方法 iOS6.0 之前
- 即将销毁View
/* 即将销毁View */
- (void)viewWillUnload {
// 发生内存警告时,在对其他视图销毁前调用。
//销毁View
NSLog(@"%s",__FUNCTION__);
}
- 已经销毁View
/* 已经销毁View */
- (void)viewDidUnload {
//发生内存警告时,如果视图不是当前屏幕正在显示的视图,viewDidUnload将会被执行,本视图所有子视图将被销毁以释放内存,此时开发者需要手动对viewLoad、viewDidLoad中创建的对象释放内存。因为当这个视图再次显示在屏幕上的时候viewLoad、viewDidLoad会再次被调用。
//销毁一些不必要的属性 和数据
NSLog(@"%s",__FUNCTION__);
}
** 给各个控制器view子控件添加约束**
程序第一次运行,显示第一个控制器的时候,按照如下顺序执行:
由第一个控制器右上角item按钮跳到第二个控制器的时候,执行打印:
由第二个控制器View中的button按钮跳到第三个控制器的时候,执行打印:
第二个控制器返回至第一个控制器的执行打印:
第三个控制器返回至第二个控制器的执行打印: