2009-11-19 126 views
6

我经常看到当我们释放ab对象时,我们立即将它设置为零。我知道release和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?

+1

很好的问题.. – tek3

回答

11

将指针设置为零不会释放该指针前一个目标占用的内存。用简单的英文,将它分配给零,但是而不是释放它。

如果您的应用程序是垃圾收集,释放是一个空操作,可以省略。否则,这是非常非常必要的。因此,方式1总是正确的,而方式2仅在垃圾回收下才是正确的。

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

+4

有一个明显的例外在这里:** **如果它是一个实例变量**和**它已被宣布为'@property(retain)'**和**你有'@ synthesis'访问器,那么这些访问器方法将负责保留和释放分配给它们的对象。当然,这只适用于使用访问器方法:'[self setObj:nil]'或'self.obj = nil'(在objc-2.0中)。 –

1

这是因为BJ说将其设置为零不会释放内存,并且在非gc收集的环境中会导致内存泄漏。那会可能是有效的,以及另一种方法是

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

obj = nil;