【发布时间】:2009-09-22 14:32:39
【问题描述】:
使用这两种方法进行内存管理的最佳实践是什么?我当前的应用程序可以在内存警告后轻松释放其视图,因为它需要大内存。在这些方法中我需要做什么?我在我的应用程序中使用了各种 nib,我将它们中的对象连接到我的视图控制器而不保留它们。从 nib 加载视图时是否需要保留 nib 对象,为什么?我在文档中看到 OS 3.0 发生了变化,我只是在谈论 3.0
【问题讨论】:
标签: iphone cocoa-touch
使用这两种方法进行内存管理的最佳实践是什么?我当前的应用程序可以在内存警告后轻松释放其视图,因为它需要大内存。在这些方法中我需要做什么?我在我的应用程序中使用了各种 nib,我将它们中的对象连接到我的视图控制器而不保留它们。从 nib 加载视图时是否需要保留 nib 对象,为什么?我在文档中看到 OS 3.0 发生了变化,我只是在谈论 3.0
【问题讨论】:
标签: iphone cocoa-touch
如果您只是在谈论 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 或您不再需要的任何其他视图相关数据的所有权。
【讨论】:
从 iOS 6 开始,viewDidUnload 永远不会被调用。来自Apple:
在 iOS 6 之前,当出现内存不足警告时, 如果 UIViewController 类知道它可以重新加载或 稍后重新创建它们。如果发生这种情况,它还会调用
viewWillUnload和viewDidUnload方法让您的代码有机会 放弃与您的视图关联的任何对象的所有权 层次结构,包括从 nib 文件加载的对象、创建的对象 在您的viewDidLoad方法中,以及在运行时延迟创建的对象和 添加到视图层次结构中。在 iOS 6 上,视图永远不会被清除并且 这些方法永远不会被调用。如果您的视图控制器需要 当内存不足时执行特定任务,它应该覆盖 didReceiveMemoryWarning 方法。
【讨论】: