在dealloc中将对象设置为nil和发送release消息有什么区别?

6
我有一个对象:
MyClass *obj= [[MyClass alloc] init];

以下是两者之间的区别:

[obj release]; // Only obj own this object.

并且:

obj = nil;

当我将obj设置为nil时,iOS会自动释放它吗?

我有一个指针,有时我将其指向一个对象,有时不指向任何东西。因此,当我想要释放指针时,我必须检查它是否为nil吗?

4个回答

13

这个回答来自上一个十年,

现在只有历史意义。

今天,你必须使用 ARC。

Cheers


非常简短的答案是不要只是将其设置为nil。你必须释放它。将其设置为nil与释放它没有任何联系。你必须释放它。

然而值得记住的是如果它是一个属性,那么

self.obj = nil;

实际上,将会为你释放它。当然,你不能忘记"self."这部分!!!!

的确,

self.obj = anyNewValue;

使用[x release]释放内存,并将其设置为nil,确实可以帮助你释放旧的内存并清除所有内容,然后用新值进行设置。因此,self.obj = nil只是这种情况的特例,它释放和清除所有内容,然后仅将其保留为nil。

如果有人对内存感到新奇和完全困惑,请注意以下几点:

  1. 在将其设置为nil x=nil之前,必须先释放它[x release]。

  2. 如果您使用属性,请“不要忘记self.语法”。

  3. 如果您使用属性,只需说self.x=nil,或者确实self.x=somethingNew,它会处理释放和所有其他复杂烦人的东西。

  4. 最终,您将不得不学习所有关于释放、自动释放等的复杂知识。但是,人生苦短,现在暂时忘记它吧:- /

希望对某些人有所帮助。

再次注意,这篇文章现在已经完全错误了。请使用ARC。

仅供历史参考。


关于属性被神奇释放的说法并不完全正确。如果您使用“retain”属性声明一个属性,则必须自己释放它,只有当您使用“copy”属性声明时,它才会以所描述的方式为您释放。请参阅http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html。 - dertoni
我认为他可能是想说“赋值”,而不是“保留”。另外,self.obj = someNewValue,会触发KVO监听器吗? - DJ Bouche
1
澄清一下,如果您正确使用属性,self.obj = newValue确实会释放旧值。我想补充一点,self.obj = newValue与[self setObj:newValue]是相同的,这就是释放发生的地方(setObj方法包含[oldValue release])。此外,如果您要释放对象,难道不希望触发KVO吗? - andyvn22
2
有趣的是,现在用Swift来看,这个答案已经古老得多了!真是一个奇妙的世界... - Fattie


5
iOS不支持垃圾回收,这意味着执行obj = nil将导致内存泄漏。 如果您想自动控制释放,应该做如下操作:obj = [[[NSObject alloc] init] autorelease](如果这样做,则不应释放它)。 自动释放池会在当前NSRunloop事件结束时自动释放对象。 NSRunloop会为每个事件迭代自动排空其NSAutoReleasePool,这通常非常有帮助。

我有一个指针,有时我会将其指向一个对象,有时则不这样做。因此,当我想要释放指针时,我必须检查它是否为nil? - asedra_le
1
为什么在释放时必须检查 nil?在 Objective-C 中,向 nil 指针发送消息是完全有效的,它只是不执行任何操作。但是,您应该始终将指针初始化为 nil 或其他有效对象。 - ImHuntingWabbits
我不明白为什么在释放之前检查 nil 是一个好主意。将 release 发送到 nil 是完全有效的,而且“真正”的非初学者程序员经常这样做。为什么要学习避免一些被广泛接受的常见做法呢? - andyvn22

2

将一个对象设置为nil会创建一个内存泄漏(如果您通过alloc,retain或copy获取所有权),因为我们没有指向该特定内存位置的指针。

因此,如果您想dealloc一个对象,在将其设置为nil之前必须取出所有对该对象的所有权,方法是调用release方法。

[obj release];
obj=nil;

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