【问题标题】:UIViewController view being unloaded even when visibleUIViewController 视图即使可见也被卸载
【发布时间】:2011-09-30 19:47:57
【问题描述】:

我有一个视图控制器 A 在导航控制器容器内以模态方式显示在另一个视图控制器 B 上。在模态显示此视图控制器 A 时模拟内存警告时,我按预期收到了 didReceiveMemoryWarnings 消息,然后我收到一条消息 viewDidUnload,从而使我的视图控制器 A 的视图消失。

这让我很惊讶,我不知道如何解决这个问题。为什么会调用viewDidUnload,释放进程中的可见视图?

这是一个堆栈跟踪,以防它有助于查明问题:

[UIViewController unloadViewForced:] ()

0x01458535 in -[UIViewController unloadViewIfReloadable] ()

0x01463eb8 in -[UINavigationController purgeMemoryForReason:] ()

0x01457b6d in -[UIViewController didReceiveMemoryWarning] ()

感谢您的帮助!

【问题讨论】:

标签: iphone ios memory uiview


【解决方案1】:

您可以通过选择硬件>>模拟内存警告从模拟器模拟内存不足警告。

并且从 IOS 6 低内存 viewDidUnload 将不会被调用。因此,您需要通过覆盖 didreceivememory 方法警告来管理可以释放的所有内存。

重要的是要了解,在 viewDidUnLoad 之后,再次调用 viewDidLoad。所以你需要假设 viewDidLoad 在 ViewController 生命周期中会得到多次。

假设你没有使用arc,并且分配数组,一段时间后由于内存不足viewDidLoad再次被调用,这一次你再次创建数组会导致内存泄漏。

【讨论】:

    【解决方案2】:

    根据http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html

    内存管理

    内存是 iOS 中的关键资源, 和视图控制器提供内置 支持减少他们的记忆 关键时刻的足迹。这 UIViewController 类提供了一些 自动处理低内存 通过其条件 didReceiveMemoryWarning 方法,其中 释放不需要的内存。在 iOS 之前 3.0,此方法是释放相关的额外内存的唯一方法 使用您的自定义视图控制器类 但在 iOS 3.0 及更高版本中, viewDidUnload 方法可能更 适合大多数需求的地方。

    当出现内存不足警告时, UIViewController 类清除其 查看它是否知道可以重新加载或 稍后重新创建它们。 如果这样 发生时,它也调用 viewDidUnload 方法 给你的代码 放弃所有权的机会 任何关联的对象 您的视图层次结构,包括对象 加载了 nib 文件,对象 在您的 viewDidLoad 方法中创建, 和在运行时延迟创建的对象 并添加到视图层次结构中。 通常,如果您的视图控制器 包含网点(属性或原始 包含 IBOutlet 的变量 关键字),您应该使用 viewDidUnload 方法放弃 这些网点或任何 您不知道的其他与视图相关的数据 需要更长的时间。

    但是我尝试在 iphone 模拟器上做同样的实验并且没有调用 viewDidUnload 方法。我认为您的行为可能会在内存非常低时发生。

    【讨论】:

      猜你喜欢
      • 2012-07-31
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多