我们为什么要释放?

时间:2009-11-19 05:16:20

标签: iphone cocoa-touch xcode memory-management

我经常看到当我们释放ab对象时,我们立即将其设置为nil。我知道release和nil都释放了与object相关的旧值,但是在释放的情况下,它将对象保留为悬空指针,所以我们必须将它设置为nil。

所以我的问题是,如果nil释放了对象的旧值并将对象设置为nil为什么我们不应该只使用nil为什么w也应该使用release。

WAY1:

MyClass *obj = [[MyClass alloc] init];
[obj release];
obj = nil;

Way2:

MyClass *obj = [[MyClass alloc] init];
obj = nil;

如果使用way1,为什么不仅仅使用way2,way1和way2的真正区别是什么?

2 个答案:

答案 0 :(得分:11)

将指针设置为nil不会释放该指针的前一个目标所占用的内存。用简单的英语,将它指定为nil 释放它。

如果您的应用程序是垃圾收集的,那么发布是无操作的,可以省略。否则,这是非常非常必要的。因此,方式1始终是正确的,并且方式2仅在垃圾收集下是正确的。

注意:此答案不适用于使用自动引用计数的项目。在ARC下,将指针设置为nil 向对象发送一个版本。

答案 1 :(得分:1)

正如BJ所说,将其设置为nil不会释放内存,并且在非gc收集的环境中会导致内存泄漏。另一种可能有效的替代方案是

MyClass *obj = [[[MyClass alloc] init] autorelease];  

obj = nil;