dealloc方法中的语句顺序是否重要? [super dealloc]
是否需要位于方法的顶部?这有关系吗?
也在例如viewDidLoad
。 [super viewDidLoad]
应该在方法的顶部吗?
答案 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首先完成工作。在撕毁时,先做好工作。
另见:
自动引用计数(ARC)是Xcode 4.2中引入的新内存管理方式。使用ARC,编译器在编译应用程序时会添加内存管理代码。它有一些你想要在使用它之前想要阅读更多的皱纹(大多数情况下,与旧的OS版本的兼容性有限)。
使用ARC,您根本不会(也不能)拨打[super dealloc]
。相反,[super dealloc]
完成时会调用dealloc
。
另见:
答案 1 :(得分:5)
dealloc方法中的语句顺序是否重要? [super dealloc]是否需要位于方法的顶部?这有关系吗?
它应该结束。这个想法是说“我已经拆掉了我已经完成的所有工作,所以现在我会让我的父类做同样的事情”(递归地)
也在例如viewDidLoad中。 [super viewDidLoad]应该位于方法的顶部吗?
它应该在顶部。在子类加载其部分之前,父类应该做它需要做的事情来加载它的视图,因为它可能依赖于父类首先需要设置的东西。