在内存警告后调用 viewdidunload 后视图从不重新加载(viewdidload 从不调用)

Posted

技术标签:

【中文标题】在内存警告后调用 viewdidunload 后视图从不重新加载(viewdidload 从不调用)【英文标题】:View never reloaded (viewdidload never called) after viewdidunload called after memory warning 【发布时间】:2011-02-22 06:40:42 【问题描述】:

我有一个主视图控制器和两个其他视图控制器作为成员变量,代表主视图中的不同“选项卡”。当点击“选项卡”时,它们会被隐藏并显示。所有这些都在一个 nib 文件中。

当我收到内存警告时,会调用 viewdidunload 并转储视图,正如预期的那样。但是,它们永远不会重新创建,并且永远不会再次调用 viewdidunload。主视图控制器附加到导航控制器。

什么给了?

【问题讨论】:

【参考方案1】:

发生内存警告时,系统可能会卸载当时在屏幕上不可见的视图控制器视图。触发重新加载这些视图控制器视图的操作实际上是试图访问这些视图。换句话说,当执行一些访问 viewController.view 的代码时,如果该视图已被卸载,则它会被重新加载。

实际上,这意味着您卸载的视图通常会在它们再次显示的位置自动重新加载。因此,在出现内存警告后,使用您的选项卡控制器变体更改当前视图,您应该会看到它已重新加载(如果确实已卸载)。

【讨论】:

我遇到的问题是它们没有重新加载,如上所述。【参考方案2】:

我通过在内存警告上转储和重新加载关联的视图控制器解决了这个问题,但最初的原因仍然是个谜。

Viewdidappear 也从未在视图上调用,我怀疑这与解释有关。

【讨论】:

【参考方案3】:

如果您正在执行视图控制器遏制,您必须始终管理视图控制器的出现和消失。

当一个视图控制器卸载它的视图时,该视图的整个层次结构都被破坏了,当然也没有保存。当父视图被重新加载时,-loadView 和 -viewDidLoad 代码以及外观方法都会被执行。这些方法不会比你告诉他们做的更多。如果您不在 viewDidLoad 中重建孩子的视图层次结构,请不要期望它们会神奇地重新出现。

容器控制器的工作是加载其子项(可见的)的视图并将它们布置在自己的视图中。

【讨论】:

以上是关于在内存警告后调用 viewdidunload 后视图从不重新加载(viewdidload 从不调用)的主要内容,如果未能解决你的问题,请参考以下文章

没有 xib 文件的 alloc/init 初始化视图控制器不调用 viewDidUnload

ios6 中不再调用 viewDidUnload

在 viewDidUnload 中我到底必须做啥?

从项目的视图控制器中删除所有 -viewDidUnload 的方法

viewdidunload 根本没有被调用

拆除 UIViewController 时是不是总是调用 viewDidUnload 和 dealloc?