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