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

ase*_*_le 6 iphone objective-c ios

我有对象:

MyClass *obj= [[MyClass alloc] init];
Run Code Online (Sandbox Code Playgroud)

有什么区别:

[obj release]; // Only obj own this object.
Run Code Online (Sandbox Code Playgroud)

和:

obj = nil;
Run Code Online (Sandbox Code Playgroud)

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

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

Fat*_*tie 13

这个答案来自前十年,

现在只是具有历史意义.

今天,你必须使用ARC.

干杯


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

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

self.obj = nil;
Run Code Online (Sandbox Code Playgroud)

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

确实,

self.obj = anyNewValue;
Run Code Online (Sandbox Code Playgroud)

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

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

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

  2. 如果您正在使用房产,"不要忘记自我."

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

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

希望它可以帮助某人.

再说一遍,这篇文章现在完全错了.使用ARC.

仅有历史意义.

  • 有趣的是,对于Swift来说,这个答案现在是双重的,三重的,古老的!真是个世界...... (2认同)

Mos*_*ieb 5

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