objective-c - 我应该将通过 Interface Builder 进行的委托(delegate)引用设为 nil 吗?

标签 objective-c cocoa delegates

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

最佳答案

简短回答:是的。

无论您是否使用 Interface Builder,委托(delegate)一旦放弃(即释放)委托(delegate)对象的所有权,就将自己作为委托(delegate)对象的委托(delegate)删除,这是一个很好的做法。这可以最晚在其 dealloc 方法中发生,但也可以在更早的时间点发生。

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

因此,在父对象释放其子对象之前(通常但并非总是在其 dealloc 方法中),它应该调用 childObject.delegate = nil;

关于objective-c - 我应该将通过 Interface Builder 进行的委托(delegate)引用设为 nil 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2248658/

相关文章:

c# - 我希望能够使用 lambda 表达式来指定要通过 wcf 服务返回的值范围

iphone - NSDateComponents 给出奇怪的结果

ios - 遍历UIImageViews- objective-c

objective-c - NSSpeechSynthesizer 更改语言

iphone - NSNotification 竞争条件

delegates - “Xcode 找不到 "UIViewControllerAnimatedTransitioning"的协议(protocol)声明”

ios - Dropbox SDK-linkFromController : delegate or callback?

iphone:应用内购买错误

objective-c - 从 NSOperation 线程更新 UITabBar 角标(Badge)图标

swift - 如何在 subview 中保留控制文本颜色的功能?