[英]What's the difference between setting an object to nil vs. sending it a release message in dealloc
我有对象:
MyClass *obj= [[MyClass alloc] init];
有什么区别:
[obj release]; // Only obj own this object.
和:
obj = nil;
当我设置obj = nil时,iOS deallocs obj吗?
我有一个指针,有时我将它指向一个对象,有时则没有。 所以,当我想要发布指针时,我必须检查它是否为零?
今天,你必须使用ARC。
干杯
非常简短的答案是不要只是将其设置为零。 你必须释放它。 将其设置为nil与释放它没有任何联系。 你必须释放它。
但是值得记住的是, 如果它是一个属性 ,那么
self.obj = nil;
事实上会为你释放它。 当然,你不能忘记“自我”。 部分!!!!
确实,
self.obj = anyNewValue;
确实会为你释放旧记忆,神奇地清理一切并用新值设置它。 所以,self.obj = nil只是一个特例,它会释放并清理所有内容,然后将其保留为零。
所以如果有人读这篇文章是新的并且完全被记忆混淆了
在将其设置为nil x = nil之前,必须将其释放[x release]
如果您正在使用房产,“不要忘记自我。”
如果你正在使用一个属性,你可以说self.x = nil或者确实是self.x = somethingNew并且它将负责释放以及所有其他复杂烦人的东西。
最终你将不得不学习关于释放,自动释放,等等等等所有复杂的东西。 但生命很短暂,暂时忘掉它: - /
希望它可以帮助某人。
iOS不支持垃圾收集,这意味着执行obj = nil
会导致内存泄漏。 如果你想自动控制重新分配,你应该做类似的事情: obj = [[[NSObject alloc] init] autorelease]
(如果你这样做,你不能释放它)。 当前NSRunloop事件结束时,Autorelease将导致对象自动释放。 NSRunloop会自动为每个事件迭代消耗它的NSAutoReleasePool,这通常非常有用。
将对象设置为nil将创建内存泄漏(如果您通过alloc,retain或copy获取所有权),因为我们没有指向该特定内存位置的指针。
因此,如果你想要释放一个对象,你必须先通过调用release方法取出一个对象的所有权,然后才能使它成为零。
[obj release];
obj=nil;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.