iOS开发 之 UIViewController的生命周期

本文的Demo工程代码参考这里的StudyUIViewAndUIVC

目录

加载

加载的完整过程: 初始化 -> loadView -> viewDidLoad -> viewWillAppear -> viewWillLayoutSubviews -> viewDidLayoutSubviews -> viewDidAppear

初始化

  • 原型

UIViewController初始化有以下三个方法

- (id)init;

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;

- (instancetype)initWithCoder:(NSCoder *)aDecode;
  • 触发

当通过init或new方法创建UIViewController对象时, 会依次调用

init -> initWithNibName:bundle:

当通过storyboard直接由系统创建UIViewController对象时, 会调用

initWithCoder:

关于初始化更准确的原文描述请参考Apple Developer API Reference

loadView

  • 原型
- (void)loadView;
  • 触发

The view controller calls this method when its view property is requested but is currently nil

  • 备注
1: 不要直接调用该方法!!!

2: 如果使用代码维护views, 必须重写该方法;  如果使用Interface Builder维护views, 不能重写该方法

viewDidLoad

  • 原型
- (void)viewDidLoad;
  • 触发

This method is called after the view controller has loaded its view hierarchy into memory

viewWillAppear

  • 原型
- (void)viewWillAppear:(BOOL)animated;
  • 触发

This method is called before the view controller'��s view is about to be added to a view hierarchy and before any animations are configured for showing the view

viewWillLayoutSubviews

  • 原型
- (void)viewWillLayoutSubviews;
  • 触发

This method is called every time the frame changes like for example when rotate or it’s marked as needing layout

viewDidLayoutSubviews

  • 原型
- (void)viewDidLayoutSubviews;
  • 触发

When the bounds change for a view controller'��s view, the view adjusts the positions of its subviews and then the system calls this method

viewDidAppear

  • 原型
- (void)viewDidAppear:(BOOL)animated;
  • 触发

This method is executed after the animation displaying the view finishes so in this step the view is already visible for the user

  • 备注
1: 在该方法适合做这些操作: 获取数据(从数据存储或网络)并显示到view

卸载

卸载的完整过程: viewWillDisappear -> viewDidDisappear -> dealloc

viewWillDisappear

  • 原型
- (void)viewWillDisappear:(BOOL)animated;
  • 触发

This method is called before the view is actually removed and before any animations are configured

viewDidDisappear

  • 原型
- (void)viewDidDisappear:(BOOL)animated;
  • 触发

You can override this method to perform additional tasks associated with dismissing or hiding the view

dealloc

  • 原型
- (void)dealloc;
  • 触发

在没有内存泄漏的情况下, dealloc是肯定会被调用的, 即使延迟释放(例如autoreleasepool)情况下, 肯定也是会被调用的

所以很多内存泄漏检测工具就是基于此, 例如MLeaksFinder

  • 备注
1: You override this method to dispose of resources other than the object’s instance variables

答疑

构建view hierarchy要放在加载时的哪个方法中?

  • 尽可能地使用Interface Builder维护views

  • 如果必须使用代码, 理论上需要放在loadView中, 但是因为

加载时的viewDidLoad方法中适合做什么操作?

  • viewDidLoad适合做与UI无关的数据和模型的操作

  • 切记不要在viewDidLoad做view hierarchy和布局的操作

sub views布局要放在加载时的哪个方法中?

  • 非autolayout的布局必须要放到viewWillLayoutSubviews

  • viewDidLoad中只确定了view的bounds, 而没有确定orientation; viewWillLayoutSubviews中才真正确定了view的布局

哪些方法需要调用父类的方法?

  • 这些方法必须调用父类的方法([super xyz]): viewWillAppear / viewDidAppear; viewDidDisappear / viewDidDisappear

  • 如果父类是UIViewController, viewDidLoad方法可以不必调用父类的方法; 如果父类是自定义类, 根据实际情况决定是否要调用

关于是否需要调用父类方法更准确的原文描述请参考Apple Developer API Reference的各接口说明

参考

更多文章, 请支持我的个人博客

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容

  • /* UIViewController is a generic controller base class th...
    DanDanC阅读 1,777评论 0 2
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,673评论 0 9
  • 陈春花的书,我将一直保持阅读。 看的书本的题目很自然会想到,《高效能人士的七个习惯》这本经管类畅销书。确实,陈老师...
    雕刻时光的猫阅读 4,970评论 0 2
  • (45)屠格涅夫笔下的《初恋》 读完屠格涅夫的《初恋》,我是有些悲伤的。 小说以第一人称叙述了一个关于少年初恋的故...
    荏苒几盈虚阅读 601评论 0 0
  • 突然很难过,眼泪在眼眶中打转,下一秒就要流下。在微博中拼命留言转发,在空间里没命刷新,在简书里翻来覆去,在游戏里跌...
    洛可可1776阅读 349评论 0 2