一. View的生命周期
先看流程图
代码:
- (void)loadView
{
NSLog(@"需要显示控制器的view的时候调用");
}
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"控制器的view加载完毕");
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:YES];
NSLog(@"控制器的view即将显示");
}
//代码布局的安全操作
- (void)viewWillLayoutSubviews
{
[super viewWillLayoutSubviews];
NSLog(@"代码布局的安全操作");
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSLog(@"控制器的view完全显示");
}
- (void)viewWillDisappear:(BOOL)animated31 {
[super viewWillDisappear:animated];
NSLog(@"控制器的view即将消失");
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
NSLog(@"控制器的view完全消失");
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
NSLog(@"接收到内存警告的时候调用");
}
- (void)viewWillUnload
{
[super viewWillUnload];
NSLog(@"控制器的view即将销毁的时候调用");
}
- (void)viewDidUnload
{
[super viewDidUnload];
NSLog(@"控制器的view完全销毁的时候调用");
}
- (void)dealloc
{
NSLog(@"控制器的view的临终遗言");
}
补充:
- 如果a控制器push到b控制器,那么a和b的View都不会被销毁,因为它的控制器还存在,有一个强引用引用着它(除非内存警告会销毁a的View) 如果b控制器pop到a控制器,那么b的View会被销毁 a和b都在导航控制器的栈里被管理,就是个数组
- 此时如果你打印会发现方法的调用顺序是: ① 控制器b的View的viewDidLoad ② 控制器b的View的viewWillAppear ③ 控制器a的View的viewDidDisappear **解释:**只有前面一个界面完全展示之后,后面一个view才会消失,不然我还没展示你就消失了,多尴尬。
二. 关于内存警告
1. 两个内存警告
- 当application接收到内存警告的时候,会先通知它的代理,代理在接收到内存警告的时候会调用applicationDidReceiveMemoryWarning方法
- 之后代理会通知它的window, window会通知它的根控制器,根控制器会通知它的子控制器,内存警告是由上往下一层一层往下传的,最后传给控制器View,控制器View会调用它的didReceiveMemoryWarning方法
2. 内存警告的处理
-
官方流程图如下:
-
怎么判断控制器的view是否可以销毁?
它是判断这个view是否是在window上面,举例如下:
当前one控制器在栈顶,one控制器对应的view显示在window上,如果此时发生内存警告,那么one因为在window上面,所以不会被销毁
若此时再push一个two控制器,它创建对应的twoView显示到window上,one对应的view移开了,此时如果发生内存警告,则此时oneView已经不再在window上显示,所以会被销毁