viewDidLoad 和 viewDidAppear 的区别

Posted

技术标签:

【中文标题】viewDidLoad 和 viewDidAppear 的区别【英文标题】:Difference between viewDidLoad and viewDidAppear 【发布时间】:2012-06-29 00:28:37 【问题描述】:

viewDidLoadviewDidAppear 有什么区别?这些函数中包含哪些类型的初始化或自定义代码?

例如presentModalViewController 仅在出现在 viewDidAppear 中时有效,在 viewDidLoad 中无效。

【问题讨论】:

见UIViewController. viewDidLoad vs. viewWillAppear: What is the proper division of labor? 【参考方案1】:

viewDidLoad 只被调用一次,当视图控制器第一次加载到内存中时。这是您要实例化任何实例变量并构建在此视图控制器的整个生命周期中存在的任何视图的地方。但是,此时视图通常还不可见。

viewDidAppear 在视图实际可见时调用,并且可以在视图控制器的生命周期内多次调用(例如,当模态视图控制器被关闭并且视图再次可见时)。这是您想要在 UI 中执行任何布局操作或进行任何绘图的地方 - 例如,呈现模态视图控制器。但是,您在这里所做的任何事情都应该是可重复的。最好不要在这里保留东西,否则当视图消失时不释放它们会导致内存泄漏。

见:https://developer.apple.com/documentation/uikit/uiviewcontroller

【讨论】:

你和 WrightsCS 是绝对正确的。但是,不是为了分叉,而是viewDidLoad 通常只调用一次且只调用一次,但有一种情况可能会再次调用它。具体来说,如果您收到didReceiveMemoryWarning,您的不可见视图可能会被释放(尽管视图控制器未被触及),当您返回时,可能会再次调用viewDidLoad 我不确定我是否同意关于视图控制器 ivars 总是自动为您发布的评论(控制器本身发布)。我怀疑我们都可以很容易地构造一个 viewDidLoad,如果在didReceiveMemoryWarning 之后重新调用它就会泄漏。但我同意,如果您在编写viewDidLoad 时采用良好的做法,您应该没问题。我唯一的一点是,对 ivars 的草率使用和手动内存管理肯定会导致 viewDidLoad 中的泄漏。人们应该对didReceiveMemoryWarning 场景敏感并相应地进行编程。 不赘述这一点,但在这次交流后不到 24 小时,我在回答 another question 时,发现了一个恰好会在 didReceiveMemoryWarning 上泄漏的 viewDidLoad 代码示例。叹息。 这个答案直接与另一个答案相矛盾:***.com/a/3411636/269753 我观察到我的 viewDidLoad 方法不止一次被调用,即使根本没有收到内存警告。有人想澄清吗? 我看不出有什么矛盾。这个问题是关于 viewDidLoad 和 viewDidUnload 之间的关系,而不是 viewDidAppear。【参考方案2】:

简单地说,您可能想在viewDidLoad 中创建任何控件或数组,而viewDidAppear 是您想要刷新这些控件或数组的地方。

viewDidLoad 在创建控制器时调用一次,并且每次视图出现时都会调用 viewDidAppear。假设您有一个模态视图,当该视图被关闭时,将调用 viewDidAppear,而不会调用 viewDidLoad

【讨论】:

第一段是一个很好的提示。但第二段是不正确的。 viewDidLoad 可能被多次调用。如果您的视图在未显示的情况下(在一堆其他视图下)被旧版本的 ios 在内存不足的情况下卸载,则视图控制器将在需要重新显示在屏幕上时自动重新加载视图。在更高版本的 iOS 中,您可以选择通过执行早期 iOS 为您做的事情来帮助减少内存使用:当didReceiveMemoryWarning 消息到达时卸载屏幕外视图,在这种情况下,viewDidLoad 将被再次调用。 @WrightsCS 你有任何官方的苹果文档这样说吗? “创建控制器时调用一次viewDidLoad”因为我记得过去viewDidLoad在内存不足的情况下可能会被调用多次。非常感谢。 developer.apple.com/library/ios/documentation/UIKit/Reference/…

以上是关于viewDidLoad 和 viewDidAppear 的区别的主要内容,如果未能解决你的问题,请参考以下文章

View & Controller 一些方法的执行顺序

IOS开发基础知识--碎片35

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

viewDidLoad 和 viewDidAppear 的区别

viewDidLoad和loadView之间的区别?

swift 中 awakeFromNib() 和 viewDidLoad() 之间的区别