ARC是否在任何自定义-dealloc代码之前或之后在-dealloc中插入代码?

时间:2012-01-22 21:23:32

标签: iphone ios ipad memory-management automatic-ref-counting

有时我仍然需要编写一个-dealloc方法来进行清理。在极少数情况下,我需要引用实例的属性来正确地进行清理。例如从NSNotificationCenter取消注册给定的发件人对象,该对象由属性拥有和引用。

ARC是否在我自己的代码之后插入了它的属性释放代码,还是在我自己的代码之前在-dealloc的开头插入了它?

如果ARC在任何自定义-dealloc代码之前插入代码,那么这将是非常危险的,因为如果需要你不能再访问属性。

这个问题是关于ARC在合成的-dealloc中插入属性释放代码的位置,而不是实现-dealloc的实现方式。

2 个答案:

答案 0 :(得分:7)

我认为,所有内容都在这里说:http://clang.llvm.org/docs/AutomaticReferenceCounting.html#misc.special_methods.dealloc

  

7.1.2。的dealloc

     

如果程序包含选择器dealloc的消息send或@selector表达式,则程序格式不正确。

     

理由:没有合理的理由直接调用dealloc。

     

类可以为名为dealloc的实例方法提供方法定义。此方法将在对象的最终版本之后但在解除分配或销毁其任何实例变量之前调用。当方法返回时,将自动调用超类的dealloc实现。

     

基本原理:即使ARC自动销毁实例变量,仍然有合理的理由来编写dealloc方法,例如释放不可保留的资源。在这种方法中未能调用[super dealloc]几乎总是一个bug。有时候,对象只是试图阻止自己被破坏,但是dealloc对于提出这种异议的对象实在太晚了。更合理的是,一个对象可能已经被池分配,不应该免费释放;目前,这只能通过ARC之外的dealloc实现来支持。这样的实现必须非常小心地完成NSObject的dealloc所能完成的所有其他工作,这超出了本文档的描述范围。

答案 1 :(得分:4)

ARC在dealloc链的末尾释放实例变量。换句话说,运行继承链中的所有dealloc方法,然后然后将释放任何ARC管理的实例变量。您可以将其视为-[NSObject dealloc]中发生的事情,尽管它甚至比它更晚。

所以请放心; ARC不会在-dealloc方法中从您的下方发布您的媒体资源。 ARC将无法释放它们,直到您无法再引用它们为止。