正确[super dealloc]

jar*_*ryd 13 iphone dealloc

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

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

Ste*_*her 43

绝对重要.

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

使用手动释放 - 保留

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

使用MRR,[super dealloc]应该在您的方法结束时.

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

- (void)dealloc
{
    [member release];
    [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)

超级dealloc实际上释放了内存.考虑一下.如果您在此之后访问实例变量,如下所示:

[super dealloc];
[member release];
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

通常,在构建(或加载)时,让super首先完成工作.在撕毁东西时,先做好自己的工作.

也可以看看:

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

使用自动参考计数

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

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

也可以看看:


Sha*_*rog 5

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

它应该在最后.这个想法是说"我已经拆掉了我已经完成的所有工作,所以现在我将让我的父类做同样的事情"(递归)

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

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

  • 我认为它"所有创业公司的东西都摆在我面前,完成的东西在我之后." (2认同)