ViewDidLoad and ARC and XIBs



假设我们使用ARC编写代码,那么viewDidUnload中的nil属性是否应该从实例化

  1. XIB(这里的nilling有时是从IDE生成的)

  2. 来自初始化程序并且没有IBOutlet

  3. 都很弱

viewDidUnload的目的是让您的应用程序有机会删除对用户界面对象的引用,这些对象可能已不存在,因为视图在收到内存警告时已被删除。因此:

  1. 您应该将任何用户界面控件设置为nil(因为视图正在卸载)。weak属性是不必要的(根据苹果关于这个主题的指导,它们通常应该是weak),但如果Xcode为您插入它,这不是问题。有关在viewDidUnload中执行操作的指导,请参阅《资源编程指南:Nib文件》的"内存警告"部分。

  2. 对于您在viewDidLoad中设置的非用户界面对象,我会注意不要在viewDidUnload中盲目地将其设置为nil,尤其是如果您没有使用ARC(例如,如果您意外地将实例变量nil设置为实例变量,则可能会导致泄漏)。您可能希望平衡将恢复的内存量与重新检索数据的"成本"(例如,如果数据来自某个远程服务器)。无论如何,我建议您在didReceiveMemoryWarning中处理非UI对象的内存释放。

在我看来,viewDidUnload是一个确保我没有维护对可能不再存在的用户界面对象的引用的机会,我使用didReceiveMemoryWarning来清空缓存或其他与UI无关的项目,我可以安全地清除这些项目以恢复一些内存。如果你担心iOS 6,请注意,viewDidUnload的处理方式可能会发生变化,虽然NDA禁止我们公开讨论它,但我建议你可以参考iOS 6 Beta 4发行说明,并查找viewDidUnload的参考资料。

您的一般规则:

  1. CCD_ 17全部仅为CCD_ 18。别管weak
  2. nil所有属性都在viewDidLoad中实例化,而不是initinitWithCoder:initWithNibName:bundle:

您还应该"动态"重新创建的nil属性或进行nil检查,以释放更多内存。

最新更新