为什么我们应该发布?

6

我经常看到在释放一个对象时,我们会立即将其设置为nil。我知道release和nil都可以释放与对象相关联的旧值,但是在release的情况下,它会使对象成为悬空指针,因此我们必须将其设置为nil。

那么我的问题是,如果nil可以释放对象的旧值并将对象设置为nil,为什么我们不仅使用nil而要使用release呢。

方法1:

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

方法2:

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

如果使用way1,与使用way2相比有什么真正的区别?为什么不只使用way2呢?
2个回答

11

将指针设置为nil不会释放先前指针的目标占用的内存。简单来说,将其分配给nil并不会释放它。

如果您的应用程序使用垃圾收集器,则释放操作是无操作并且可以省略。否则,它非常非常必要。因此,Way 1始终是正确的,而Way 2仅在使用垃圾收集时正确。

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


4
这里有一个明显的例外情况:如果它是实例变量 并且已声明为 @property (retain)并且您已经使用 @synthesized 合成了访问器,那么这些访问器方法将负责保留和释放您分配给它们的对象。当然,这仅适用于您使用访问器方法时:[self setObj:nil]self.obj = nil(在 objc-2.0 中)。 - mbauman

1

就像BJ所说的那样,将其设置为nil并不会释放内存,在非垃圾收集环境中会导致内存泄漏。另一个可能有效的替代方法是

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

obj = nil;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接