将对象设置为nil与在dealloc中发送释放消息之间的区别是什么

时间:2010-11-18 07:44:24

标签: iphone objective-c ios

我有对象:

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

有什么区别:

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

obj = nil;

当我设置obj = nil时,iOS deallocs obj吗?

我有一个指针,有时候我将它指向一个对象,有时则没有。所以,当我想要发布指针时,我必须检查它是否为零?

4 个答案:

答案 0 :(得分:13)

这个答案来自前十年,

现在只具有历史意义。

今天,您必须使用ARC。

干杯


非常简短的答案是 不要 只需将其设置为零。 您必须将其释放。 将其设置为nil与释放它无关。你必须释放它。

但值得记住如果是属性,那么

self.obj = nil;

事实上会为你释放它。当然,你不能忘记“自我”。部分!!!!

实际上,

self.obj = anyNewValue;

确实会为你释放旧记忆,神奇地清理一切并用新值设置它。所以,self.obj = nil只是一个特例,它会释放并清理所有内容,然后将其保留为零。

因此,如果有人读这篇文章是新的并且完全被记忆混淆了,

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

  2. IF 您正在使用某个属性,“不要忘记自我。”

  3. IF 你正在使用一个属性,你可以说self.x = nil或者确实是self.x = somethingNew它会照顾释放和所有其他复杂烦人的东西

  4. 最终你将不得不学习所有关于释放,自动释放,等等等等的复杂内容。但是生命很短暂,暂时忘掉它: - /

  5. 希望它有所帮助。

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

    仅限历史利益。

答案 1 :(得分:5)

答案 2 :(得分:5)

iOS不支持垃圾收集,这意味着执行obj = nil会导致内存泄漏。 如果您想要自动控制重新分配,您应该执行以下操作:obj = [[[NSObject alloc] init] autorelease](如果您这样做,则必须释放它)。 当前NSRunloop事件结束时,Autorelease将导致对象自动释放。 NSRunloop会自动为每个事件迭代消耗它的NSAutoReleasePool,这通常非常有用。

答案 3 :(得分:2)

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

所以如果你想要释放一个对象,你必须通过调用release方法取出一个对象的所有权,然后再调用它。

[obj release];
obj=nil;