导航控制器(NavigationController)的生命周期

一 先来解释一下导航控制器的生命周期中的几个方法

- (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中创建如下:

导航控制器(NavigationController)的生命周期_第1张图片

三 为每个UIViewControllers创建对应的类,并在类中写入如下方法:
第一个控制器:OneViewControllers

导航控制器(NavigationController)的生命周期_第2张图片

第二个控制器:TwoViewControllers

导航控制器(NavigationController)的生命周期_第3张图片

第三个控制器: ThreeViewControllers

导航控制器(NavigationController)的生命周期_第4张图片

四 然后运行:

这里写图片描述

可以看出调用的方法是:viewDidLoad -> viewWillAppear -> viewDidAppear,这个很好理解,接下来:

然后点击跳转到第二个控制器button会怎样呢?

导航控制器(NavigationController)的生命周期_第5张图片

可以看出是这样的执行顺序:

oneView的viewWillDisappear -> twoView的viewDidLoad ->twoView的viewWillAppear -> oneView的ViewDidDisAppear ->twoView的ViewDidAppear

它是把第一个控制器先移走,然后装载并且显示第二个控制器,并没有把第一个控制器销毁,而是把它放到了一个内存中的一个位置,是一个弹栈的过程,将第一个控制器弹出。

那么如果点回第一个控制器会怎么样呢?

导航控制器(NavigationController)的生命周期_第6张图片

没错,第二个控制器被销毁啦,第一个控制器被压回了栈中,变成了栈顶。为什么要把第二个控制器销毁呢?其实很容易想出来,如果我们一直保留着下一层控制器,那么内存占用肯定会越来越多,但是第一层的控制器你肯定是要回来的,所以没有必要销毁。

那肯定会有人迷惑,如果从第三个控制器直接跳转到第一控制器,第二个控制器会怎样?其实,第二个控制器,也是会销毁的。试验一下:
导航控制器(NavigationController)的生命周期_第7张图片

可以看出,在oneView出现之前就把twoView给销毁啦

总结:① 当一个控制器向子控制器跳转时:先执行oneView的viewWillDisappear -> twoView的viewDidLoad ->twoView的viewWillAppear -> oneView的ViewDidDisAppear ->twoView的ViewDidAppear 第一个控制器并不会被销毁

② 当子控制器向上跳转时,期间的子控制器包括自己都会被销毁。

你可能感兴趣的:(移动开发,面试)