【问题标题】:How to use didReceiveMemoryWarning and viewDidUnload?如何使用 didReceiveMemoryWarning 和 viewDidUnload?
【发布时间】:2009-09-22 14:32:39
【问题描述】:

使用这两种方法进行内存管理的最佳实践是什么?我当前的应用程序可以在内存警告后轻松释放其视图,因为它需要大内存。在这些方法中我需要做什么?我在我的应用程序中使用了各种 nib,我将它们中的对象连接到我的视图控制器而不保留它们。从 nib 加载视图时是否需要保留 nib 对象,为什么?我在文档中看到 OS 3.0 发生了变化,我只是在谈论 3.0

【问题讨论】:

    标签: iphone cocoa-touch


    【解决方案1】:

    如果您只是在谈论 iOS 3.0,请在 viewDidUnload 中发布您可以轻松重新创建的任何对象。然后,您可以从 viewDidLoad 中的 nib 重新创建或重新加载它们。确保当你释放对象时,你要么将它们清零,要么让你的二传手这样做。这样,您可以在重新加载或重新创建之前使用 viewDidLoad 检查是否为 nil。

    至于从 nib 对象加载,如果您正在加载到您的属性中,并将它们设置为保留,那么您不必再次保留。

    来自Apple

    UIViewController 类通过其 didReceiveMemoryWarning(第 20 页)方法提供了一些低内存条件的自动处理,该方法释放了不需要的内存。

    在 iPhone OS 3.0 之前,此方法是释放与自定义视图控制器类关联的额外内存的唯一方法,但在 iPhone OS 3.0 及更高版本中,viewDidUnload(第 30 页)方法可能更适合大多数需求.当发生内存不足警告时,如果 UIViewController 类知道以后可以重新加载或重新创建它们,则它会清除其视图。如果发生这种情况,它还会调用 viewDidUnload 方法,让您的代码有机会放弃与视图层次结构关联的任何对象的所有权,包括使用 nib 文件加载的对象、在 viewDidLoad(第 29 页)方法中创建的对象,以及对象在运行时延迟创建并添加到视图层次结构中。通常,如果您的视图控制器包含 outlet(包含 IBOutlet 关键字的属性或原始变量),您应该使用 viewDidUnload 方法放弃对这些 outlet 或您不再需要的任何其他视图相关数据的所有权。

    【讨论】:

    • 需要注意的是,自 2009 年以来,随着 iOS 的更新,上面的引用已经发生了变化。要获得最新版本,请前往 online UIViewController docs,或使用答案中的链接最新的 PDF 版本。
    • 这个答案已经过时了。见罗斯的回答。
    【解决方案2】:

    从 iOS 6 开始,viewDidUnload 永远不会被调用。来自Apple

    在 iOS 6 之前,当出现内存不足警告时, 如果 UIViewController 类知道它可以重新加载或 稍后重新创建它们。如果发生这种情况,它还会调用 viewWillUnloadviewDidUnload 方法让您的代码有机会 放弃与您的视图关联的任何对象的所有权 层次结构,包括从 nib 文件加载的对象、创建的对象 在您的 viewDidLoad 方法中,以及在运行时延迟创建的对象和 添加到视图层次结构中。在 iOS 6 上,视图永远不会被清除并且 这些方法永远不会被调用。如果您的视图控制器需要 当内存不足时执行特定任务,它应该覆盖 didReceiveMemoryWarning 方法。

    【讨论】:

      猜你喜欢
      • 2011-05-20
      • 2011-07-01
      • 1970-01-01
      • 2011-10-14
      • 2011-04-10
      • 2012-09-22
      • 2023-03-03
      • 1970-01-01
      • 2011-10-02
      相关资源
      最近更新 更多