13

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

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

4

2 回答 2

45

绝对很重要。

您所做的取决于您使用的是自动引用计数 (ARC) 还是手动引用计数。

使用手动释放-保留

Manual Release-Retain (MRR) 是所有 Mac OS X 版本的默认内存管理,也是 Xcode 4.2 之前处理内存的唯一方法。

使用 MRR,[super dealloc]应该在方法的末尾

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

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

super dealloc 实际上释放了内存。考虑一下。如果之后访问实例变量,如下所示:

[super dealloc];
[member release];

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

正如 Apple 在内存管理编程指南中解释的那样:

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

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

通常,在构建(或加载)时,让超级先完成工作。拆东西时,先做你的工作。

也可以看看:

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

使用自动引用计数

自动引用计数 (ARC) 是 Xcode 4.2 中引入的一种新的内存管理方式。使用 ARC,编译器会在编译应用程序时添加内存管理代码。它有一些皱纹,您在使用它之前需要了解更多信息(主要是与旧操作系统版本的兼容性有限)。

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

也可以看看:

于 2010-12-30T21:42:26.823 回答
5

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

它应该在最后。这个想法是说“我已经拆除了我所做的所有部分,所以现在我会让我的父类也这样做”(递归)

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

它应该在顶部。父类应该在子类加载其部分之前执行加载其视图所需的操作,因为它可能依赖于父类需要首先设置的东西。

于 2010-12-30T21:43:07.650 回答