使用这两种方法进行内存管理的最佳做法是什么?我的当前应用程序可以在内存警告后轻松释放其视图,因为它需要大量内存。我需要在这些方法中做些什么?我在我的应用程序中使用各种笔尖,并且我将它们中的对象连接到我的视图控制器而不保留它们。从笔尖加载视图时是否需要保留nib对象?为什么?我在文档中看到OS 3.0已经发生了变化,我只是在谈论3.0
答案 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类如果知道它可以重新加载或清除它的视图 之后再次重新创建它们。如果发生这种情况,它也会调用
viewWillUnload
和viewDidUnload
方法可为您的代码提供机会 放弃与您的视图关联的任何对象的所有权 层次结构,包括从nib文件加载的对象,创建的对象 在您的viewDidLoad
方法中,以及在运行时懒惰创建的对象 添加到视图层次结构中。在iOS 6上,视图永远不会被清除 永远不会调用这些方法。如果您的视图控制器需要 当内存不足时执行特定任务,它应该覆盖 didReceiveMemoryWarning方法。