iOS中视图控制器生命周期和视图生命周期有啥区别?

Posted

技术标签:

【中文标题】iOS中视图控制器生命周期和视图生命周期有啥区别?【英文标题】:What is the difference between view controller life cycle and view life cycle in iOS?iOS中视图控制器生命周期和视图生命周期有什么区别? 【发布时间】:2015-02-25 17:20:28 【问题描述】:

阅读了几本关于ios开发的教程和书籍,我经常遇到术语:UIViewController生命周期和UIView生命周期。我很感兴趣:这两个术语之间有实际的区别吗? 查看Apple docs我发现viewDidAppearloadView等方法是视图控制器生命周期的一部分,但我认为将它们称为视图生命周期和initWithNibNamedealloc等方法更正确作为控制器的生命周期。或者没有这样的分离,当有人谈到视图生命周期时,他实际上是指UIViewController生命周期?

【问题讨论】:

【参考方案1】:

两者是不同的概念,因此具有不同的生命周期。

UIViewController

ViewController 是MVC architecture 中的控制器。因此,它负责协调模型(您的数据)和您的视图之间的信息。 UIViewControllers 协调 UIView 并且是屏幕之间导航的一部分(pushViewControllerpresentViewController)。因此它需要知道它什么时候会出现在屏幕上。

UIViewController 有一个非常具体的生命周期,并且它具有可以扩展的方法,这些方法是该生命周期的一部分。这些方法的示例是:

viewDidLoadviewWillAppearviewDidAppearviewWillDisappearviewDidDisappear

查看

另一方面,当视图必须出现在屏幕上时,不必担心。因此,它具有完全不同的生命周期:

awakeFromNibwillMoveToSuperViewdidMoveToSuperView

This methods usually are called in the sequence of the UIViewController's life cycle。因此,通常情况下,UIView 会响应变化,人们不会认为他们有自己的生命周期。

ViewController 的生命周期仅在类扩展 UIViewController 时才有意义,而 UIView 的生命周期仅在扩展 UIView 时才有意义。

大多数时候,当人们谈论生命周期时,他们会谈论UIViewController 生命周期,因为视图通常会响应变化。这些变化的两个例子是:视图改变了它的大小,改变了它的父级。

【讨论】:

一般来说,你的答案是正确的,但有点过时了。从 iOS 6 开始,UIViewController 永远不会在内存不足的情况下从内存中清除其视图。特别是,永远不会调用 viewWillUnload 和 viewDidUnload 方法。 Documentation. 这些天的生命周期几乎只是在第一次调用 UIViewController.view 时加载视图,在视图层次结构中添加和删除任意次数,并在 @987654343 期间或之后的某个时间释放@ 当它已经在视图层次结构之外时。 你是对的,但我找不到一个好的更新图表。也许我应该删除它,但我相信将过时的图表可视化比不理解连接更好。我也试图为 UIView 找到一个好的图表(连接到 UIVIewController 图表)但找不到它:(。你们认为最好删除这个图表?【参考方案2】:

一旦您完全意识到两个课程之间的区别并将其根植于您的脑海中(通过实践),您所有的困惑都会消失

UIViewController - 一个本身没有 UI 的类(虽然不完全正确...参见根视图),它的目的是控制 视图并做一些相关的东西..就像警察或交通管制员对他人进行监管。 (意见)。 大多数时候,您创建自己的 UIViewController 子类,并且该类往往在功能上相当繁重,例如

处理逻辑规则何时显示什么视图 连接到模型层(有关您的应用正在解决的问题的数据和事实) 与其他控制器交互,

UIView - 一个代表矩形区域的类,可以在视觉上进行大量修改,但最重要的事实是,它在屏幕上可见,并且可以具有子视图,它们也是UIViews。视图被组织成视图层次结构。 大多数时候你自定义你的视图,以便它是

视觉上赏心悦目 通过自动布局处理它的子视图 表示您需要的特定类型的视觉信息,通常是更具体的视图类(如标签、文本、按钮等)的子类。

让新手感到困惑的一点是每个视图控制器都有一个根视图,这是一个包含UIView 实例的属性。通常你会迷失是否讨论了这个根视图,或者讨论了视图控制器。在开发人员之间的因果讨论中,这两个词有时可以互换使用。


控制器和视图都有生命周期,但不能混淆两者。

ViewController 生命周期是控制器本身发生的事情,比如它从 nib 文件中唤醒,或者收到内存不足的警告,但主要是关于它的根视图是如何变得活跃的,它是如何消失的以及死了..

视图生命周期是关于视图如何布置其子视图以及如何呈现其内容。


我喜欢视觉类比.. 简单地想象一个有很多彩色纸矩形的警察。警察是控制者,他会说出屏幕上显示的内容(视图)和时间。

控制器和视图是抽象的一部分(模型视图控制器)MVC架构模式。我建议你立即研究,这样生命周期混乱的问题在你的脑海中进一步清除.

【讨论】:

【参考方案3】:

添加这些答案并更多地关注您的确切问题:

我很感兴趣:这两者之间是否有实际区别 条款?

是的,两者之间存在差异,但在您处理 UIViewController'sUIView 的上下文中,它们在某种程度上是相关的。

查看 Apple 文档,我发现 viewDidAppear 或 loadView 等方法是视图控制器生命周期的一部分,但我认为将它们称为视图生命周期和将 initWithNibName 或 dealloc 等方法称为控制器生命周期更正确。

这就是它们相关的原因:

viewWillAppear viewDidAppear viewWillDisappear viewDidDisappear:

它们都在文档中的响应查看事件下。所以这些是从UIViewUIViewController 的回调,告诉它它的状态。虽然:

loadView viewDidLoad

不在同一部分(在文档中),它是UIView 请求/告诉UIViewController 关于其当前状态。您还有这些交互的其他示例,例如:

viewWillLayoutSubviews viewDidLayoutSubviews

在某种程度上(在您的问题的上下文中),一般答案是:是的,这是两个具有不同特性的不同生命周期,但它们在某种程度上是相关的。它们不直接相关的一个示例是UIViewControllerdidReceiveMemoryWarning。 (我直接说,因为间接地,它可能是UIViewController的根UIView的罪魁祸首)。

【讨论】:

【参考方案4】:
Most of the lifecycle is handled automatically by the 
system and no need for calling some methods like parent and child view 
controllers relationship
Here are the mentioned lifecycle methods for UIView:
didAddSubview(_:)
willRemoveSubview(_:)
willMove(toSuperView:)
didMoveToSuperview
willMove(toWindow:)
didMoveToWindow

【讨论】:

以上是关于iOS中视图控制器生命周期和视图生命周期有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 5.0 查看生命周期问题

[ IOS ] 视图控制对象ViewController的生命周期

iOS学习笔记—ViewController/生命周期

Aurelia 中组件和视图之间的区别(及其生命周期)

IOS7笔记-5视图控制器生命周期

IOS视图控制器导航及生命周期研究Demo