正确[super dealloc]

时间:2010-12-30 21:37:05

标签: iphone dealloc

dealloc方法中的语句顺序是否重要? [super dealloc]是否需要位于方法的顶部?这有关系吗?

也在例如viewDidLoad[super viewDidLoad]应该在方法的顶部吗?

2 个答案:

答案 0 :(得分:43)

绝对很重要。

您的操作取决于您使用的是自动参考计数(ARC)还是手动参考计数。

使用手动释放 - 保留

手动释放 - 保留(MRR)是所有Mac OS X版本的默认内存管理,也是在Xcode 4.2之前处理内存的唯一方法。

使用MRR,[super dealloc]应位于您方法的 end

所以你的代码应该是这样的:

- (void)dealloc
{
    [member release];
    [super dealloc];
}

super dealloc实际上释放了内存。考虑一下。如果您在此之后访问实例变量,请执行以下操作:

[super dealloc];
[member release];

...这意味着实例变量可能无效。在对super dealloc的调用和对成员释放的调用之间,理论上存储成员指针的字节可能已被改为其他东西!

正如Apple在Memory Management Programming Guide中解释的那样:

  

dealloc方法的作用是释放对象自己的内存,并处置它拥有的任何资源,包括任何对象实例变量的所有权。

您可以通过处理对象所拥有的任何资源并调用[super dealloc]来完成此操作。它处理它所拥有的任何对象,并调用它的超级对象。依此类推,直到最终根对象将实例本身使用的内存标记为空闲。到[super dealloc]返回时,您的实例已被释放。 (当然,它中的指针可能有效,但这是你不应该依赖的实现细节。)

通常,在构建(或加载)时,让super首先完成工作。在撕毁时,先做好工作。

另见:

  • dealloc,NSObject类参考,Mac OS X开发人员库
  • Deallocating an Object,对象所有权和处置,内存管理编程指南,Mac OS X开发人员库

使用自动参考计数

自动引用计数(ARC)是Xcode 4.2中引入的新内存管理方式。使用ARC,编译器在编译应用程序时会添加内存管理代码。它有一些你想要在使用它之前想要阅读更多的皱纹(大多数情况下,与旧的OS版本的兼容性有限)。

使用ARC,您根本不会(也不能)拨打[super dealloc]。相反,[super dealloc]完成时会调用dealloc

另见:

答案 1 :(得分:5)

  

dealloc方法中的语句顺序是否重要? [super dealloc]是否需要位于方法的顶部?这有关系吗?

它应该结束。这个想法是说“我已经拆掉了我已经完成的所有工作,所以现在我会让我的父类做同样的事情”(递归地)

  

也在例如viewDidLoad中。 [super viewDidLoad]应该位于方法的顶部吗?

它应该在顶部。在子类加载其部分之前,父类应该做它需要做的事情来加载它的视图,因为它可能依赖于父类首先需要设置的东西。