导航控制器(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中创建如下:

这里写图片描述

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

OneViewControllers 代码

第二个控制器:TwoViewControllers

TwoViewControllers 代码

第三个控制器: ThreeViewControllers

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 第一个控制器并不会被销毁

② 当子控制器向上跳转时,期间的子控制器包括自己都会被销毁。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值