一、环境构建
1. 将下列代码复制到要探究的 ViewController 中
//类的初始化方法
+ (void)initialize {
NSLog(@"%s", __func__);
[super initialize];
}
//对象初始化方法
- (instancetype)init {
NSLog(@"%s", __func__);
return [super init];
}
//从归档初始化
- (instancetype)initWithCoder:(NSCoder *)coder
{
NSLog(@"%s", __func__);
return [super initWithCoder:coder];
}
// 通常使用 awakeFromNib() 可以进行在Storyboard设计时无法完成的必要额外设置。
- (void)awakeFromNib {
NSLog(@"%s", __func__);
[super awakeFromNib];
}
//加载视图
-(void)loadView {
NSLog(@"%s", __func__);
[super loadView];
}
//将要加载视图
- (void)viewDidLoad {
NSLog(@"%s", __func__);
[super viewDidLoad];
self.view.backgroundColor = [UIColor yellowColor];
}
//将要布局子视图
-(void)viewWillLayoutSubviews {
NSLog(@"%s", __func__);
[super viewWillLayoutSubviews];
}
//已经布局子视图
-(void)viewDidLayoutSubviews {
NSLog(@"%s", __func__);
[super viewDidLayoutSubviews];
}
//内存警告
- (void)didReceiveMemoryWarning {
NSLog(@"%s", __func__);
[super didReceiveMemoryWarning];
}
//已经展示
-(void)viewDidAppear:(BOOL)animated {
NSLog(@"%s", __func__);
[super viewWillAppear:animated];
}
//将要展示
-(void)viewWillAppear:(BOOL)animated {
NSLog(@"%s", __func__);
[super viewWillAppear:animated];
}
//将要消失
-(void)viewWillDisappear:(BOOL)animated {
NSLog(@"%s", __func__);
[super viewWillDisappear:animated];
}
//已经消失
-(void)viewDidDisappear:(BOOL)animated {
NSLog(@"%s", __func__);
[super viewDidDisappear:animated];
}
//被释放
-(void)dealloc {
NSLog(@"%s", __func__);
}
二、ViewController 之间的 push 和 pop
1. 纯代码
构建 SecondViewController ,由 push 到 pop 调用顺序
Demo[7766:315672] +[SecondViewController initialize]
Demo[7766:315672] -[SecondViewController init]
Demo[7766:315672] -[SecondViewController loadView]
Demo[7766:315672] -[SecondViewController viewDidLoad]
Demo[7766:315672] -[SecondViewController viewWillAppear:]
Demo[7766:315672] -[SecondViewController viewWillLayoutSubviews]
Demo[7766:315672] -[SecondViewController viewDidLayoutSubviews]
Demo[7766:315672] -[SecondViewController viewDidAppear:]
Demo[7766:315672] -[SecondViewController viewWillDisappear:]
Demo[7766:315672] -[SecondViewController viewDidDisappear:]
Demo[7766:315672] -[SecondViewController dealloc]
2. xib
构建 SecondViewController ,由 push 到 pop 调用顺序
Demo[7907:322725] +[SecondViewController initialize]
Demo[7907:322725] -[SecondViewController initWithCoder:]
Demo[7907:322725] -[SecondViewController awakeFromNib]
Demo[7907:322725] -[SecondViewController loadView]
Demo[7907:322725] -[SecondViewController viewDidLoad]
Demo[7907:322725] -[SecondViewController viewWillAppear:]
Demo[7907:322725] -[SecondViewController viewWillLayoutSubviews]
Demo[7907:322725] -[SecondViewController viewDidLayoutSubviews]
Demo[7907:322725] -[SecondViewController viewDidAppear:]
Demo[7907:322725] -[SecondViewController viewWillDisappear:]
Demo[7907:322725] -[SecondViewController viewDidDisappear:]
Demo[7907:322725] -[SecondViewController dealloc]
3. 纯代码
构建 SecondViewController ,push 到 纯代码
构建 ThirdViewController ,然后再 pop,仅关注 push 和 pop
- SecondViewController
push
ThirdViewController
Demo[8297:338910] +[ThirdViewController initialize]
Demo[8297:338910] -[ThirdViewController init]
Demo[8297:338910] -[ThirdViewController loadView]
Demo[8297:338910] -[ThirdViewController viewDidLoad]
Demo[8297:338910] -[SecondViewController viewWillDisappear:]
Demo[8297:338910] -[ThirdViewController viewWillAppear:]
Demo[8297:338910] -[ThirdViewController viewWillLayoutSubviews]
Demo[8297:338910] -[ThirdViewController viewDidLayoutSubviews]
Demo[8297:338910] -[SecondViewController viewDidDisappear:]
Demo[8297:338910] -[ThirdViewController viewDidAppear:]
Demo[8297:338910] -[ThirdViewController viewWillDisappear:]
Demo[8297:338910] -[SecondViewController viewWillAppear:]
Demo[8297:338910] -[ThirdViewController viewDidDisappear:]
Demo[8297:338910] -[SecondViewController viewDidAppear:]
Demo[8297:338910] -[ThirdViewController dealloc]
4. ViewController 之间的 present 和 dismiss
- 在
UIModalPresentationFullScreen
模式下 resent dismiss
和 push pop
的一致。
三、 ViewController 的各个方法解释说明
1. - (instancetype)initWithCoder:(NSCoder *)coder
- 当使用
Storyboard
创建时,会调用,且仅调用一次。
2. - (void)awakeFromNib
- 当使用
Storyboard
创建时,该方法会被调用。
- 当调用该方法时,将保证所有的 outlet 和 action 连接完成。
- 通常使用
awakeFromNib()
可以进行在设计时无法完成的必要额外设置。
3. - (instancetype)init
4. loadView()
-
loadView()
即加载控制器管理的 View。
- 在控制器生命周期中,该方法只会被调用一次。
- 一般不重写该方法,执行初始化操作,建议放到
viewDidLoad()
中。
5. viewDidLoad()
- view 被加载到内存后调用
viewDidLoad()
。
- 在控制器生命周期中,该方法只会被调用一次。
- 一般在该方法中添加子控件。
6. viewWillAppear()
- 该方法在控制器 view 即将添加到视图层次时被调用。
- 在控制器生命周期中,该方法会被调用多次。
- 一般在该方法中操作即将显示的 view,例如状态栏的改版;还有 form 数据的更新也一般放在这里。
7. viewWillLayoutSubviews()
- 该方法在在通知控制器将要布局 view 的子控件时调用。
- 在控制器生命周期中,该方法会被调用多次。
8. viewDidLayoutSubviews()
- 该方法在通知控制器已经布局 view 的子控件时调用。
- 在控制器生命周期中,该方法会被调用多次。
9. viewDidAppear()
- 该方法再控制器 view 已经添加到视图层次时被调用。
- 在控制器生命周期中,该方法会被调用多次。
10. viewWillDisappear()
- 该方法再控制器 view 将要从视图层次移除时被调用。
- 该方法可重写以提交变更,取消视图第一响应者状态。
11. viewDidDisappear()
- 该方法再控制器 view 已经从视图层次移除时被调用。
- 该方法可以重写以做一些收尾操作。
12. didReceiveMemoryWarning()
- 当内存预警时,该方法被调用。
- 不能直接手动调用该方法。
- 该方法可重写以释放资源、内存。
13. dealloc()