Objective-C设置零和释放之间的差异

Objective-C设置零和释放之间的差异,objective-c,cocoa-touch,properties,release,null,Objective C,Cocoa Touch,Properties,Release,Null,我了解到,在dealloc中,您可以[对象释放]但是在viewDidUnload(在UIViewController子类中)您可以self.object=nil。因为self.object=nil(我们假设object是(非原子,retain)属性)保留nil(不做任何操作),然后释放旧值,然后引用计数为0,所以真正的区别是什么?self.object=nil调用您的setter,它将释放旧值,将成员设置为nil,并可能执行其他操作(这是一种方法,因此它可以执行任何操作)。其中“任何”部分都有潜

我了解到,在
dealloc
中,您可以
[对象释放]
但是在
viewDidUnload
(在UIViewController子类中)您可以
self.object=nil
。因为
self.object=nil
(我们假设object是
(非原子,retain)
属性)保留
nil
(不做任何操作),然后释放旧值,然后引用计数为0,所以真正的区别是什么?

self.object=nil
调用您的setter,它将释放旧值,将成员设置为
nil
,并可能执行其他操作(这是一种方法,因此它可以执行任何操作)。其中“任何”部分都有潜在危险;例如,见

[object release]
释放旧值,但将成员保留为现在悬空的指针,这是一个很好的bug解决方法。在
dealloc
中,这并不重要,因为指针本身也将消失,但在任何其他情况下,在不将其设置为
nil的情况下释放成员都是一个非常糟糕的主意


(作为旁注,您永远不要假设释放对象会使其引用计数为0。它会释放您的引用,但其他对象可能仍有对它的引用。)

如果仅释放对象,则它将成为释放对象


若你们试图在被释放的对象上执行任何类型的操作,那个么你们的应用程序就会崩溃。为避免此类事故,最好是“释放对象后将其指定为零”。因为我们都知道在nil上执行的任何操作都不会被执行:)

如果在没有
[object release]
的情况下执行
object=nil
,则可能会导致内存泄漏。如果您在没有
object=nil
的情况下执行
[object release]
,则对象将变成@Jim建议的悬空指针
self.object=nil
是setter函数调用的糖。

如果您执行[object release],并且想要访问对象,应用程序就会崩溃。 如果执行object=nil,并且希望访问该对象,则不会执行任何操作

原因是在[object release]中,您试图释放该对象。因此它没有任何指针(无备忘录)。在
object=nil,
中,您试图为对象分配空指针。因此,如果你试图访问该对象,将不会发生任何事情


通常我们将代码编写为[
objectrelease];对象=零因为如果你意外访问对象,应用程序不会崩溃。

还请注意,苹果特别建议不要在init和dealloc中使用setter/getter(有充分的理由),因此在dealloc中使用[object release]——这不仅仅是“在dealloc中它并不重要”,在dealloc中它是推荐的方式。对,我的意思是,拥有一个非nil指针并不重要(比如,在dealloc中发布后,您不需要执行object=nil),实际上,对于合成IVAR,setter在dealloc中必须是usd。请参阅搜索短语“合成实例变量”。@ustun,这不一定是真的。您可以使用合成IVAR并使用如下声明进行合成:@synthesis myIvar=\u myIvar;然后在dealoc中,使用[_myivarrelease]@我们注意到
[myivar release]
实际上没有使用setter。它使用的实例变量支持
self.myivar
。因此,
[myivar release]
myivar=nil
在dealloc中是完美的。但是,
self.myivar=nil
不是。