一 先来解释一下导航控制器的生命周期中的几个方法
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"view加载完成");
}
- (void)viewWillAppear:(BOOL)animated {
NSLog(@"view即将出现");
}
- (void)viewDidAppear:(BOOL)animated {
NSLog(@"view已经出现");
}
- (void)viewWillDisappear:(BOOL)animated {
NSLog(@"one view即将消失");
}
-(void)viewDidDisappear:(BOOL)animated {
NSLog(@"view已经消失");
}
- (void)dealloc {
NSLog(@"view已经销毁");
}
二 为了验证导航控制器的生命周期,在storyboard中创建如下:
三 为每个UIViewControllers创建对应的类,并在类中写入如下方法:
第一个控制器:OneViewControllers
第二个控制器:TwoViewControllers
第三个控制器: ThreeViewControllers
四 然后运行:
可以看出调用的方法是:viewDidLoad -> viewWillAppear -> viewDidAppear,这个很好理解,接下来:
然后点击跳转到第二个控制器button会怎样呢?
可以看出是这样的执行顺序:
oneView的viewWillDisappear -> twoView的viewDidLoad ->twoView的viewWillAppear -> oneView的ViewDidDisAppear ->twoView的ViewDidAppear
它是把第一个控制器先移走,然后装载并且显示第二个控制器,并没有把第一个控制器销毁,而是把它放到了一个内存中的一个位置,是一个弹栈的过程,将第一个控制器弹出。
那么如果点回第一个控制器会怎么样呢?
没错,第二个控制器被销毁啦,第一个控制器被压回了栈中,变成了栈顶。为什么要把第二个控制器销毁呢?其实很容易想出来,如果我们一直保留着下一层控制器,那么内存占用肯定会越来越多,但是第一层的控制器你肯定是要回来的,所以没有必要销毁。
那肯定会有人迷惑,如果从第三个控制器直接跳转到第一控制器,第二个控制器会怎样?其实,第二个控制器,也是会销毁的。试验一下:
可以看出,在oneView出现之前就把twoView给销毁啦
总结:① 当一个控制器向子控制器跳转时:先执行oneView的viewWillDisappear -> twoView的viewDidLoad ->twoView的viewWillAppear -> oneView的ViewDidDisAppear ->twoView的ViewDidAppear 第一个控制器并不会被销毁
② 当子控制器向上跳转时,期间的子控制器包括自己都会被销毁。