initWithNibName,awakeFromNib和viewDidLoad的描述?

Eli*_*eth 19 iphone cocoa-touch ios

是否有一个很好的概述initWithNibName,awakeFromNib以及viewDidLoad,规定了使用的每一种最好的方式,准确地各做什么介绍?我发现这些非常令人困惑.在使用View Controller生成的模板中,评论initWithNibName说:

指定的初始化程序.覆盖以执行加载视图之前所需的设置.

除了这个方法似乎永远不会被调用(我正在使用IB来设置View Controller).我应该使用awakeFromNibviewDidLoad初始化吗?

小智 35

我刚刚完成了对这个主题的一些研究,所以我想我会分享一些我学到的东西.

  1. 使用awakeFromNibiPhone的视图没有任何问题.请参阅此Apple Dev文档.

  2. initWithCoder不是当视图是从NIB文件中加载,因为在相同的NIB文件的其他项目,也可能没有在这一点上初始化做初始化的好地方.例如,出口可能仍然是零.保证在调用时正确初始化同一NIB文件中的所有项目awakeFromNib.

  3. viewDidLoad 一个在viewController中进行设置工作的好地方.

那么为什么要awakeFromNib在视图中使用呢?我能想到的一个原因是,如果在初始化视图并将其连接到NIB文件中的其他对象之后,您想要执行某些操作,但是您希望仅将其封装在视图中.这减少了与视图控制器的链接.


Jas*_*oco 24

如果您在IB中创建视图,那么您应该使用viewDidLoad.每次初始化视图时都会调用它.您使用initWithNibName:在代码中创建视图时.您不应该使用awakeFromNibiPhone的视图.

initWithNibName似乎没有被调用的原因是接口构建器实际上创建了视图控制器的真实实例,然后序列化该视图.因此,当您在IB中创建视图控制器(基本上将其添加到项目中)时,IB会调用initWithNibName,但除非您已覆盖默认值encodeWithCoder:,在视图加载时,您在此处设置的任何瞬态变量都将消失来自笔尖(反序列化).这通常是可以的,因为您通常希望使用特定于应用程序当前,运行上下文的信息而不是预先确定的初始化程序来设置视图.

但是,即使您以编程方式创建视图和视图控制器,仍然可以将所有初始化设置为viewDidLoad.这通常更好,因为如果您的视图最终被缓存(卸载)然后返回到屏幕上,viewDidLoad则可以在初始化程序不一定的情况下再次调用.例如,您以编程方式创建视图并将其推送到导航控制器的堆栈 - 稍后视图已被掩盖并发出内存警告,以便导航控制器"卸载"您的视图但不释放对象 - 当视图时回来(其他视图弹出),导航控制器将viewDidLoad再次调用,以便您可以重新初始化,但initWithNib不会再次调用.请注意,这是一种罕见的情况,然而,此时大多数人的应用程序将因其他原因而死亡.

  • 贾斯梅的回答比上面的回答要多得多. (2认同)