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
不是。