Iphone 正确[超级解除锁定]

Iphone 正确[超级解除锁定],iphone,dealloc,Iphone,Dealloc,dealoc方法中语句的顺序重要吗?[super dealloc]是否需要位于方法的顶部?这有关系吗 也可在例如viewDidLoad中使用。[super viewDidLoad]应该在方法的顶端吗?它绝对重要 您所做的取决于您使用的是自动引用计数(ARC)还是手动引用计数 使用手动释放保留 手动释放保留(MRR)是所有版本Mac OS X的默认内存管理,也是在Xcode 4.2之前处理内存的唯一方法 有了MRR,[super dealoc]应该位于方法的末尾 因此,您的代码应该如下所示: -

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


也可在例如
viewDidLoad
中使用。
[super viewDidLoad]
应该在方法的顶端吗?

它绝对重要

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

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

有了MRR,
[super dealoc]
应该位于方法的末尾

因此,您的代码应该如下所示:

- (void)dealloc
{
    [member release];
    [super dealloc];
}
[super dealloc];
[member release];
超级dealloc实际上释放了内存。想想看。如果在此之后访问实例变量,如下所示:

- (void)dealloc
{
    [member release];
    [super dealloc];
}
[super dealloc];
[member release];
…这意味着实例变量可能无效。在调用super dealloc和调用member release之间,理论上,存储成员指针的字节可以被更改为其他字节

正如苹果在报告中所解释的:

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

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

一般来说,在建造(或装载)时,让超级工程师先完成工作。拆东西时,先做你的工作

另见:

  • ,NSObject类参考,Mac OS X开发人员库
  • ,对象所有权和处置,内存管理编程指南,Mac OS X开发人员库
具有自动参考计数功能 自动引用计数(ARC)是Xcode 4.2中引入的内存管理新方法。使用ARC,编译器在编译应用程序时添加内存管理代码。在使用它之前,您可能想了解更多关于它的信息(大多数情况下,与旧操作系统版本的兼容性有限)

使用ARC,您根本不(也不能)调用
[super dealoc]
。相反,当您的
dealloc
完成时,会调用
[super dealloc]

另见:

  • LLVM解除锁定
dealoc方法中语句的顺序重要吗?[super dealoc]是否需要位于方法的顶部?这有关系吗

它应该在最后结束。这个想法是说“我已经删除了我所做的所有部分,所以现在我将让我的父类做同样的事情”(递归)

也可在例如viewDidLoad中使用。[super viewDidLoad]是否应位于方法的顶部


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

我认为这是“所有启动的东西都在我前面,完成的东西在我后面。”Objective-c没有“成员变量”。除此之外,完全正确。所以。。。[super dealloc]实际上会导致分配给该派生类实例的内存损坏,或可供堆重用?我问的原因只是为了理解两者的区别。在C++中,对象的内存不会被堆(或拥有它的人)释放,直到析构函数返回。根对象的dealloc释放实例本身