viewDidLoad和viewDidAppear之间的区别


Answers:


147

viewDidLoad第一次将视图控制器加载到内存中时,仅调用一次。在这里您要实例化任何实例变量并构建在该视图控制器的整个生命周期中都有效的任何视图。但是,此刻该视图通常不可见。

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

请参阅:https//developer.apple.com/documentation/uikit/uiviewcontroller


15
您和WrightsCS绝对正确。但是,不是为了分裂头发,而是虽然viewDidLoad通常只被调用一次并且只能被调用一次,但是在一种情况下,可以再次调用它。具体来说,如果您收到,则didReceiveMemoryWarning可能会释放不可见的视图(尽管视图控制器未被触摸),并且当您返回时,viewDidLoad可能会再次调用它们。
罗布

1
我不确定我是否总是同意并自动为您发布有关视图控制器ivars的评论(控制器本身并未发布)。我怀疑我们俩都可以轻松构造一个viewDidLoad,如果在之后重新调用它,它将泄漏didReceiveMemoryWarning。但是我同意,如果您在编写自己的文章时采用好的做法viewDidLoad,那应该没问题。我唯一的观点是,草率使用ivars和手动内存管理肯定会导致泄漏viewDidLoad。人们应该对didReceiveMemoryWarning场景敏感并进行相应的编程。
罗布

2
不必太着急了,但是在这次交换之后不到24小时,我在回答另一个问题的同时,找到了一个示例,确切viewDidLoad说明了将泄漏到的那种代码didReceiveMemoryWarning。叹。
罗布

1
这个答案与另一个答案直接矛盾:stackoverflow.com/a/3411636/269753我观察到我的viewDidLoad方法被调用了多次,甚至根本没有收到内存警告。有人要澄清吗?
里卡多·桑切斯·塞兹

2
我看不出有矛盾。这个问题是关于viewDidLoad和viewDidUnload,而不是viewDidAppear之间的关系。
davidgoli 2013年

21

简而言之,您想在中创建任何控件或数组viewDidLoad,就像在viewDidAppear其中刷新这些控件或数组一样。

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


3
第一段是一个不错的提示。但是第二段是不正确的。viewDidLoad可能被多次调用。如果在内存不足的情况下,较早版本的iOS卸载了未显示的视图(位于其他视图堆栈中),则视图控制器将在需要重新显示在屏幕上时自动重新加载视图。在更高版本的iOS中,您可以选择通过执行较早的iOS为您执行的操作来帮助减少内存使用:在didReceiveMemoryWarning消息到达时卸载屏幕外视图,在这种情况下viewDidLoad将再次调用。
罗勒·布尔克

@WrightsCS您是否有任何官方的苹果文件说?“创建控制器时,将调用一次viewDidLoad”,因为我记得过去在内存不足的情况下可以多次调用viewDidLoad。非常感谢。
里卡多

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.