为啥在释放对象后使用'nil'

Posted

技术标签:

【中文标题】为啥在释放对象后使用\'nil\'【英文标题】:Why using 'nil' after releasing objects为什么在释放对象后使用'nil' 【发布时间】:2011-12-28 09:31:22 【问题描述】:

有时我在 Objective-c 中看到了这种类型的编码。为什么释放后设置_imageView为nil。

 - (void)dealloc 
    [_imageView release];
    _imageView = nil;
    [super dealloc];
 

【问题讨论】:

【参考方案1】:

这是为了确保您不会尝试重复使用刚刚发布的对象。

通过将其设置为 nil,您可以确保将来发送给它的任何消息都将被丢弃(标准 nil 对象的行为)而不是引起问题。

【讨论】:

在旁注中,通常不需要在 dealloc 方法中将 ivar 设置为 nil。除非有人对超类 ivars 做一些骇人听闻的事情。【参考方案2】:

只是因为这是安全的做法。

在 dealloc 中,除非您使用线程,否则它实际上并没有多大意义,但除此之外,每次将 nil 分配给对象时都这样做总是好的(除非它是一个属性)。

【讨论】:

【参考方案3】:

据我了解,在 dealloc 中没有必要。但是,当在任何其他方法中释放对象时,指针仍将保留,但它指向的对象将不再存在,从而在向其发送消息时导致崩溃。

通过将指针设置为 nil,您可以确保发送给它的任何消息都将被忽略,而不是使您的应用程序崩溃(或导致奇怪的行为)。

【讨论】:

以上是关于为啥在释放对象后使用'nil'的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 ObjC 块在释放时不释放其捕获的引用?包括失败的单元测试

我应该在 ARC 中使用 nil

释放 NSArray 时将对象设置为 nil

自动释放并分配给 nil

nil 和释放对象的区别

具有大量自动释放对象的线程如果是/否,在这种情况下是不是必须使用自动释放池,为啥?