Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 什么';将对象设置为nil与在dealloc中向其发送释放消息之间的区别是什么_Iphone_Objective C_Ios - Fatal编程技术网

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 x=nil之前,必须先释放它[x release]

  • 如果您正在使用属性,“不要忘记self.thingy”

  • 如果你正在使用一个属性,你可以说self.x=nil或者self.x=somethingNew,它将负责发布和所有其他复杂的烦人内容

  • 最终,你将不得不学习所有关于发布、自动释放之类的复杂内容。但生命是短暂的,暂时忘掉它吧:-/

  • 希望它能帮助别人

    再次注意,这篇文章现在完全错了。使用圆弧。
    仅对历史感兴趣。将对象设置为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;