Iphone 什么';将对象设置为nil与在dealloc中向其发送释放消息之间的区别是什么
我反对:Iphone 什么';将对象设置为nil与在dealloc中向其发送释放消息之间的区别是什么,iphone,objective-c,ios,Iphone,Objective C,Ios,我反对: MyClass *obj= [[MyClass alloc] init]; 这两者之间的区别是什么: [obj release]; // Only obj own this object. 以及: 当我设置obj=nil时,iOS是否取消分配obj 我有一个指针,有时我把它指向一个对象,有时我没有。所以,当我想要释放一个指针时,我必须检查它是否为nil 阅读上面的内容。他们全面回答您的问题iOS不支持垃圾收集,这意味着执行obj=nil将导致内存泄漏。 如果您想要自动控制释放
MyClass *obj= [[MyClass alloc] init];
这两者之间的区别是什么:
[obj release]; // Only obj own this object.
以及:
当我设置obj=nil时,iOS是否取消分配obj
我有一个指针,有时我把它指向一个对象,有时我没有。所以,当我想要释放一个指针时,我必须检查它是否为nil
阅读上面的内容。他们全面回答您的问题iOS不支持垃圾收集,这意味着执行
obj=nil
将导致内存泄漏。
如果您想要自动控制释放,您应该执行如下操作:obj=[[[NSObject alloc]init]autorelease]
(如果这样做,您必须而不是释放它)。
自动释放将导致在当前nsrunlop事件结束时自动释放对象。
NSRunloop会为每次事件迭代自动耗尽其NSAutoReleasePool,这通常非常有用。这是前十年的答案,
现在只具有历史意义。
今天,您必须使用ARC。
干杯
非常简短的答案是不要只需将其设置为零即可您必须释放它。将其设置为nil与释放它无关。你必须释放它 但是值得记住的是,如果它是一个属性,那么
self.obj = nil;
事实上,它会为你发布。当然,你不能忘记“自我”部分
的确
self.obj = anyNewValue;
确实会为你释放旧的记忆,神奇地清理一切,并用新的值设置它。因此,self.obj=nil只是其中的一个特例,它释放并清理所有内容,然后将其保留为nil
所以如果有人读到这篇文章是新的,完全被记忆搞糊涂了
仅对历史感兴趣。将对象设置为nil将导致内存泄漏(如果您通过alloc、retain或copy获得所有权),因为我们没有指向该特定内存位置的指针 所以,如果您想要解除锁定一个对象,您必须在通过调用release方法使其为nil之前获取该对象的所有所有权
[obj release];
obj=nil;
关于财产被神奇地释放的说法并不完全正确。如果您使用“retain”属性声明属性,您必须自己释放它,只有当您使用“copy”属性声明属性时,它才会以描述的方式为您释放。我想他的意思可能是“分配”,而不是“保留”。另外,self.obj=someNewValue不会触发KVO侦听器吗?为了澄清,如果正确使用属性,self.obj=newValue会释放旧值。我想添加self.obj=newValue与[self-setObj:newValue]相同,这就是发布的方式(setObj方法包含[oldValue release])。另外,如果你要释放这个对象,难道你不想触发KVO吗?有趣的是,有了Swift,这个答案现在是双重的,三倍的,古老的!多么美好的世界啊……我有一个指针,有时我设定我指向一个对象,有时我不这样做。所以,当我想要释放一个指针时,我必须检查它是否为nil?为什么在释放时必须检查nil?在objective-c中,向nil指针发送消息是完全有效的,它什么也不做。你应该总是初始化指针,指向nil或其他有效对象。我不明白为什么在释放之前检查nil是个好主意。将release发送到nil是完全有效的,“真正的”非初学者程序员总是这样做。为什么要学着避免一些被普遍接受的做法呢?
[obj release];
obj=nil;