将对象设置为零与将对象发送到释放消息之间有什么区别

我有对象:

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

有什么区别:

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

和:

 obj = nil; 

当我设置obj = nil时,iOS会释放obj吗?

我有一个指针,有时我把它指向一个对象,有时不。 所以,当我想释放一个指针,我必须检查它是零?

从前十年的这个答案,

现在只是历史的兴趣。

今天,你必须使用ARC。

干杯


很简短的答案是不要把它设置为零。 你必须释放它。 将其设置为零,无法释放它。 你必须释放它。

但值得记住的是, 如果它是一个财产 ,那么

 self.obj = nil; 

将在事实上释放给你。 当然,你不能忘记“自我”。 部分!

确实,

 self.obj = anyNewValue; 

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

所以如果有人读这本书是新的,而且完全被记忆所迷惑,

  1. 你必须释放它,[x释放]之前设置为无x =零

  2. 如果你正在使用财产,“不要忘记自我。

  3. 如果你正在使用一个属性,你可以说self.x = nil或者确实是self.x = somethingNew,它会照顾到所有其他复杂的恼人的东西。

  4. 最终,你将不得不学习所有关于释放,自动释放,等等等等的复杂的东西。 但是生命短暂,现在忘记它: – /

希望它可以帮助别人。

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

只有历史的兴趣。

在Objective-C中设置指针为零是否必要?

释放,Dealloc和自我引用

设置对象零与释放+ realloc

阅读以上内容。 他们全面回答你的问题

iOS不支持垃圾收集,这意味着做obj = nil会导致内存泄漏。 如果你想自动控制取消分配,你应该这样做: obj = [[[NSObject alloc] init] autorelease] (如果你这样做,你不能释放它)。 自动释放会导致当前的NSRunloop事件结束时自动释放该对象。 NSRunloop会为每个事件迭代自动消耗NSAutoReleasePool,这通常很有帮助。

设置一个对象nil将会产生一个内存泄漏(如果你通过alloc获取所有权,保留或复制),因为我们没有指向这个特定内存位置的指针。

所以如果你想释放一个对象,你必须先取出对象的全部所有权,然后通过调用释放方法使之成为零。

 [obj release]; obj=nil;