如何使用didReceiveMemoryWarning和viewDidUnload?

时间:2009-09-22 14:32:39

标签: iphone cocoa-touch

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

2 个答案:

答案 0 :(得分:4)

如果您只是在谈论iOS 3.0,请在viewDidUnload中发布您可以轻松重新创建的任何对象。然后,您可以在viewDidLoad中的笔尖中重新创建或重新加载它们。确保在释放对象时,您要么将它们取出,要么让您的设置器执行此操作。这样,您可以在重新加载或重新创建之前使用viewDidLoad检查是否为nil。

对于从nib对象加载,如果要加载到属性中,并将它们设置为retain,则不必再次保留。

来自Apple

  

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

     

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

答案 1 :(得分:3)

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

  

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