viewDidUnload
已弃用。因此,无论 ARC 是什么,您不仅不需要而且不应该使用。声明的理由是视图不再因内存不足警告而被清除(大概是因为它们现在对总数的贡献太小,不值得响应性打击);viewDidLoad
如果部分理由是很多人认为他们可以释放内部创建的所有资源viewDidUnload
并且仅此一项就可以防止泄漏,我不会感到惊讶。这不是真的,因为viewDidUnload
仅当视图因内存不足警告而被卸载时才调用。在正常的生命周期中不会调用它。
根据ARC 的新规则:
如果您需要管理资源而不是释放实例变量,您可以实现一个 dealloc 方法。您不必(实际上您不能)释放实例变量
编辑:特别评论4.3+...
ARC 不会viewDidUnload
为您实现一个版本。viewDidLoad
/循环的要点viewDidUnload
是,如果您retain
出于任何原因进入视图层次结构的任何部分,那么您将导致它不会在内存不足警告时自动释放,但这样做不会给您带来任何好处,因为只要接下来加载视图,您保留的任何内容都将被新副本替换。因此,如果您无论如何strong
IBOutlet
都拥有位于下面层次结构中的视图,self.view
那么理想情况下,您会在viewDidUnload
. 即使您有weak
引用,这也是防止自己继承任何悬空指针的好地方。
从 iOS 5 开始,您可以拥有自归零弱引用,因此viewDidUnload
如果您支持 5+,则使用这些而不是实现将是可行的方法。对于 4.3,如果您使用强引用并省略viewDidUnload
,您最终可能会像 Apple 所希望的那样彻底阻止对低内存警告的响应,但您不会泄漏内存。如果您使用弱引用,那么在您可能没有视图的时候(即,任何时候您没有显示但视图之前已加载 - 设置器)时,您需要小心不要引用任何这些对象在控制器上同时调整视图但受另一个视图影响的控制器是一个经典示例;例如,如果您通过键值观察来更新字段)。
您可以使用模拟器的“模拟内存警告”在一定程度上测试和调试这些东西。
dealloc
无论 iOS 版本如何,ARC 提供的都是相同的。但是它只涵盖了 Objective-C 对象。当他们说您不能释放实例变量时,他们的意思是字面意义上的release
向他们发送消息。假设您有 Core Foundation 对象或执行了纯 C 内存分配,那么您将希望实现一个dealloc
处理所有这些对象的方法。
显然 Instruments 和 Leaks 工具是测试和调试该区域的方法;任何时候内存泄漏都要小心检查创建该内存的对象类型是否也被泄漏。直接对象可以很好,但如果它没有dealloc
因为其他人泄漏它,它的分配将出现在泄漏列表中。