UIViewController生命周期分析

做一个实验,通过实验来分析viewController的生命周期。

和生命周期几个相关的方法
- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"FirstVC viewDidLoad");
    
}
-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear];
    NSLog(@"FirstVC viewWillAppear");
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    NSLog(@"FirstVC didReceiveMemoryWarning");
}
-(void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:YES];
    NSLog(@"FirstVC viewWillDisappear");
}
-(void)loadView
{
    [super loadView];
    NSLog(@"FirstVC loadView");
}
-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    NSLog(@"FirstVC viewDidLayoutSubviews");
}
-(void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];
    NSLog(@"FirstVC viewWillLayoutSubviews");
}
-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:YES];
    NSLog(@"FirstVC viewDidAppear");
}
-(void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:YES];
    NSLog(@"FirstVC viewDidDisappear");
}
-(void)awakeFromNib
{
    [super awakeFromNib];
        NSLog(@"FirstVC awakeFromNib");
}

请注意:为了保证代码顺利执行,且保证模拟器顺利加载ViewController,请务必添加[super viewxxxxx]的代码来初始化。 我试过去掉所有的[super viewxxxx]代码,控制台打印如下

2016-03-24 10:31:28.328 SIMAlbum[33599:524075] FirstVC awakeFromNib
2016-03-24 10:31:28.333 SIMAlbum[33599:524075] SecondView awakeFromNib
2016-03-24 10:31:28.771 SIMAlbum[33599:524075] FirstVC loadView
2016-03-24 10:31:28.771 SIMAlbum[33599:524075] FirstVC viewDidLoad
2016-03-24 10:31:28.834 SIMAlbum[33599:524075] FirstVC loadView
2016-03-24 10:31:28.834 SIMAlbum[33599:524075] FirstVC viewDidLoad
2016-03-24 10:31:28.835 SIMAlbum[33599:524075] FirstVC loadView
2016-03-24 10:31:28.835 SIMAlbum[33599:524075] FirstVC viewDidLoad
2016-03-24 10:31:28.835 SIMAlbum[33599:524075] FirstVC loadView
2016-03-24 10:31:28.835 SIMAlbum[33599:524075] FirstVC viewDidLoad
2016-03-24 10:31:28.835 SIMAlbum[33599:524075] FirstVC viewWillAppear
2016-03-24 10:31:28.835 SIMAlbum[33599:524075] FirstVC loadView
2016-03-24 10:31:28.835 SIMAlbum[33599:524075] FirstVC viewDidLoad
2016-03-24 10:31:28.842 SIMAlbum[33599:524075] FirstVC loadView
2016-03-24 10:31:28.842 SIMAlbum[33599:524075] FirstVC viewDidLoad
2016-03-24 10:31:28.897 SIMAlbum[33599:524075] FirstVC viewDidAppear

但是你会发现模拟器加载的是一个黑色的没有任何内容的ViewController 相应的在第一个,即将push出来的ViewController也放入上面的代码。 以上便是与viewController生命周期相关的方法。

从StoryBoard加载

先放出进入第一个viewController时的控制台输出

2016-03-24 10:55:17.503 SIMAlbum[35103:546098] FirstVC awakeFromNib
2016-03-24 10:55:17.506 SIMAlbum[35103:546098] SecondView awakeFromNib
2016-03-24 10:55:17.625 SIMAlbum[35103:546098] FirstVC loadView
2016-03-24 10:55:17.626 SIMAlbum[35103:546098] FirstVC viewDidLoad
2016-03-24 10:55:17.658 SIMAlbum[35103:546098] FirstVC viewWillAppear
2016-03-24 10:55:17.676 SIMAlbum[35103:546098] FirstVC viewWillLayoutSubviews
2016-03-24 10:55:17.676 SIMAlbum[35103:546098] FirstVC viewDidLayoutSubviews
2016-03-24 10:55:17.678 SIMAlbum[35103:546098] FirstVC viewWillLayoutSubviews
2016-03-24 10:55:17.678 SIMAlbum[35103:546098] FirstVC viewDidLayoutSubviews
2016-03-24 10:55:17.769 SIMAlbum[35103:546098] FirstVC viewDidAppear

没错,和我们熟悉的生命周期大致内容是一致的。 接下来push进第二个viewController:

2016-03-24 10:55:38.848 SIMAlbum[35103:546098] SecondView awakeFromNib
2016-03-24 10:55:38.853 SIMAlbum[35103:546098] SecondView loadView
2016-03-24 10:55:38.865 SIMAlbum[35103:546098] SecondView viewDidLoad
2016-03-24 10:55:38.865 SIMAlbum[35103:546098] FirstVC viewWillDisappear
2016-03-24 10:55:38.867 SIMAlbum[35103:546098] SecondView viewWillAppear
2016-03-24 10:55:38.884 SIMAlbum[35103:546098] SecondView viewWillLayoutSubviews
2016-03-24 10:55:38.903 SIMAlbum[35103:546098] SecondView viewDidLayoutSubviews
2016-03-24 10:55:38.904 SIMAlbum[35103:546098] FirstVC viewWillLayoutSubviews
2016-03-24 10:55:38.904 SIMAlbum[35103:546098] FirstVC viewDidLayoutSubviews
2016-03-24 10:55:38.905 SIMAlbum[35103:546098] SecondView viewWillLayoutSubviews
2016-03-24 10:55:38.905 SIMAlbum[35103:546098] SecondView viewDidLayoutSubviews
2016-03-24 10:55:39.413 SIMAlbum[35103:546098] FirstVC viewDidDisappear
2016-03-24 10:55:39.413 SIMAlbum[35103:546098] SecondView viewDidAppear

接下来push进第三个ViewController,为了看到第二个viewController的过程,没有在第三个viewController添加任何代码,控制台输出如下:

2016-03-24 10:55:57.906 SIMAlbum[35103:546098] SecondView viewWillDisappear
2016-03-24 10:55:57.920 SIMAlbum[35103:546098] SecondView viewWillLayoutSubviews
2016-03-24 10:55:57.920 SIMAlbum[35103:546098] SecondView viewDidLayoutSubviews
2016-03-24 10:55:58.424 SIMAlbum[35103:546098] SecondView viewDidDisappear

返回第二个viewController:

2016-03-24 10:56:10.539 SIMAlbum[35103:546098] SecondView viewWillAppear
2016-03-24 10:56:10.541 SIMAlbum[35103:546098] SecondView viewWillLayoutSubviews
2016-03-24 10:56:10.552 SIMAlbum[35103:546098] SecondView viewDidLayoutSubviews
2016-03-24 10:56:11.055 SIMAlbum[35103:546098] SecondView viewDidAppear

返回第一个viewController

2016-03-24 10:56:48.577 SIMAlbum[35103:546098] SecondView viewWillDisappear
2016-03-24 10:56:48.577 SIMAlbum[35103:546098] FirstVC viewWillAppear
2016-03-24 10:56:48.587 SIMAlbum[35103:546098] FirstVC viewWillLayoutSubviews
2016-03-24 10:56:48.587 SIMAlbum[35103:546098] FirstVC viewDidLayoutSubviews
2016-03-24 10:56:49.091 SIMAlbum[35103:546098] SecondView viewDidDisappear
2016-03-24 10:56:49.091 SIMAlbum[35103:546098] FirstVC viewDidAppear
2016-03-24 10:56:49.093 SIMAlbum[35103:546098] FirstVC viewWillLayoutSubviews
2016-03-24 10:56:49.093 SIMAlbum[35103:546098] FirstVC viewDidLayoutSubviews
代码加载viewController

依旧做了个实验,进入代码生成的viewController时控制台输出如下:

2016-03-24 11:09:49.361 SimDraw[36310:564381] FirstVC loadView
2016-03-24 11:09:49.370 SimDraw[36310:564381] FirstVC viewDidLoad
2016-03-24 11:09:49.381 SimDraw[36310:564381] FirstVC viewWillAppear
2016-03-24 11:09:49.393 SimDraw[36310:564381] FirstVC viewWillLayoutSubviews
2016-03-24 11:09:49.393 SimDraw[36310:564381] FirstVC viewDidLayoutSubviews
2016-03-24 11:09:49.395 SimDraw[36310:564381] FirstVC viewWillLayoutSubviews
2016-03-24 11:09:49.395 SimDraw[36310:564381] FirstVC viewDidLayoutSubviews
2016-03-24 11:09:49.929 SimDraw[36310:564381] FirstVC viewDidAppear

退出时

2016-03-24 11:10:20.636 SimDraw[36310:564381] FirstVC viewWillDisappear
2016-03-24 11:10:21.166 SimDraw[36310:564381] FirstVC viewDidDisappear

分析与总结

以上的结果简单粗暴,虽然和印象中的一样,但是还是有些许出入,我系统的做了个viewControll的图:

注意到其中的viewWillLayoutSubviews和viewDidLayoutSubviews,调用情况视具体的viewDidLoad和viewWillAppear等方法中的代码而定。

viewWillLayoutSubviews调用情况分析
  • init初始化不会触发layoutSubviews
  • addSubview会触发layoutSubviews
  • 设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化
  • 滚动一个UIScrollView会触发layoutSubviews
  • 旋转Screen会触发父UIView上的layoutSubviews事件
  • 改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏iOS技术

iOS多线程应用(三):NSOperation

NSOperation是基于GCD的面向对象封装,在各大开源库里面我们常常看到它的身影。它的使用很简单易懂,基本上你点进Api就会用了,本文就最常用的功能进行讲...

33011
来自专栏Alice

(whh仅供自己参考)进行ip网络请求的步骤

这个过程大致是这个样子: 1 添加通知 2 发送网络请求 里边有一个发送通知的操作 3 执行发送通知的具体操作 代码如下: 1 在VC添加通知 [[NSNo...

1966
来自专栏iOS 开发

UIButton扩展Block点击事件

1933
来自专栏雨尘分享

ReactiveCocoa 入门知识——归总篇

2264
来自专栏DannyHoo的专栏

KVO代码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

961
来自专栏遊俠扎彪

CentOS 5.6 下使用 vsFTPd 架设 FTP Server

主要配置文件/etc/vsftpd/vsftpd.conf,配置如下:

2445
来自专栏技术之路

ios 接收 c# socket udp 组播

最近用wcf 服务 给ios和安卓做接口,做了几个ios的项目  用udp 组播 让ios多终端接收和刷新方法 做一个简单的小例子会把工程给大家下载的   c#...

2698
来自专栏美团技术团队

ReactiveCocoa中潜在的内存泄漏及解决方案

ReactiveCocoa是GitHub开源的一个函数响应式编程框架,目前在美团App中大量使用。用过它的人都知道很好用,也确实为我们的生活带来了很多便利,特别...

5318
来自专栏哈雷彗星撞地球

iOS 中如何判断当前是2G/3G/4G/5G/WiFi

5G 什么的,还得等苹果API更新啊,不过将来还是这个处理过程就是了。 关于判断当前的网络环境是2G/3G/4G,这个问题以前经常看到,最近在一工程里看到了如...

2342
来自专栏一“技”之长

iOS获取通讯录联系人信息 原

随着apple对用户隐私的越来越重视,IOS系统的权限设置也更加严格,在获取系统通讯录之前,我们必须获得用户的授权。权限申请代码示例如下:

2383

扫码关注云+社区

领取腾讯云代金券