dealloc 方法中语句的顺序是否重要?是否[super dealloc]
需要在方法的顶部?有关系吗?
也在例如viewDidLoad
。应该[super viewDidLoad]
在方法的顶部?
这绝对很重要。
您所做的取决于您使用的是自动引用计数 (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]
返回时,您的实例已被释放。(当然,其中的指针可能是有效的,但这是您不应该依赖的实现细节。)
通常,在构建(或加载)时,让超级先完成工作。拆东西时,先做你的工作。
也可以看看:
自动引用计数 (ARC) 是 Xcode 4.2 中引入的一种新的内存管理方式。使用 ARC,编译器会在编译应用程序时添加内存管理代码。它有一些皱纹,您在使用它之前需要了解更多信息(主要是与旧操作系统版本的兼容性有限)。
使用 ARC,您根本不会(也不能)打电话[super dealloc]
。相反,在您完成[super dealloc]
时调用。dealloc
也可以看看:
dealloc 方法中语句的顺序是否重要?[super dealloc] 是否需要位于方法的顶部?有关系吗?
它应该在最后。这个想法是说“我已经拆除了我所做的所有部分,所以现在我会让我的父类也这样做”(递归)
也在例如 viewDidLoad 中。[super viewDidLoad] 应该在方法的顶部吗?
它应该在顶部。父类应该在子类加载其部分之前执行加载其视图所需的操作,因为它可能依赖于父类需要首先设置的东西。