我应该 nil 通过 Interface Builder 进行的委托引用吗?

Posted

技术标签:

【中文标题】我应该 nil 通过 Interface Builder 进行的委托引用吗?【英文标题】:Should I nil delegate references made through Interface Builder? 【发布时间】:2010-02-11 23:48:15 【问题描述】:

如果我从 Interface Builder 将 classB 的委托属性分配给 classA,我是否应该将 IBOutlet 分配给 classB,然后在 classA 的 dealloc 中,通过插座将委托设置为 nil? (假设 classA 是 XIB 的文件所有者...)

【问题讨论】:

【参考方案1】:

简短回答:是的。

无论您是否使用 Interface Builder,委托最好在放弃(即释放)委托对象的所有权后立即将自己作为委托对象的委托移除。这最迟可以在它的 dealloc 方法中,但也可以在更早的时候发生。

原因:通常,委托是委托对象的某种父对象。很多时候,委托对象的委托人和所有者是同一个对象。因为父对象通常保留子对象,为了避免循环引用,委托(即子)对象通常不保留其委托。在这些情况下,委托对象可能会在委托对象仍处于活动状态时被释放(如果其他对象也保留了它)。如果现在委托对象尝试访问其委托(不再存在),程序可能会崩溃。

所以在父对象释放它的子对象之前(通常,但不总是,在它的 dealloc 方法中),它应该调用childObject.delegate = nil;

【讨论】:

您不应该取消delegate 属性,除非您实际上是代表:if ([otherObject delegate] == self) [otherObject setDelegate:nil]; 1) Interface Builder 建立了连接,所以它不应该负责取消它吗? 2) 父对象甚至可能没有对委托对象的引用,因为它是在 Interface Builder 中创建的,没有明确的出口。那么如何取消它的委托呢?

以上是关于我应该 nil 通过 Interface Builder 进行的委托引用吗?的主要内容,如果未能解决你的问题,请参考以下文章

Go 神坑 1 —— interface{} 与 nil 的比较

Go 神坑 1 —— interface{} 与 nil 的比较

如何将 nil 接口转换为 nil 其他接口

iPad的UIPopoverController“不能用`nil`调用”错误

当 AdvertisingIdentifier 为 nil 时,我应该使用啥方法?

Golang Interface 解析