【发布时间】:2010-02-11 23:48:15
【问题描述】:
如果我从 Interface Builder 将 classB 的委托属性分配给 classA,我是否应该将 IBOutlet 分配给 classB,然后在 classA 的 dealloc 中,通过插座将委托设置为 nil? (假设 classA 是 XIB 的文件所有者...)
【问题讨论】:
标签: objective-c cocoa delegates
如果我从 Interface Builder 将 classB 的委托属性分配给 classA,我是否应该将 IBOutlet 分配给 classB,然后在 classA 的 dealloc 中,通过插座将委托设置为 nil? (假设 classA 是 XIB 的文件所有者...)
【问题讨论】:
标签: objective-c cocoa delegates
简短回答:是的。
无论您是否使用 Interface Builder,委托最好在放弃(即释放)委托对象的所有权后立即将自己作为委托对象的委托移除。这最迟可以在它的 dealloc 方法中,但也可以在更早的时候发生。
原因:通常,委托是委托对象的某种父对象。很多时候,委托对象的委托人和所有者是同一个对象。因为父对象通常保留子对象,为了避免循环引用,委托(即子)对象通常不保留其委托。在这些情况下,委托对象可能会在委托对象仍处于活动状态时被释放(如果其他对象也保留了它)。如果现在委托对象尝试访问其委托(不再存在),程序可能会崩溃。
所以在父对象释放它的子对象之前(通常,但不总是,在它的 dealloc 方法中),它应该调用childObject.delegate = nil;。
【讨论】:
delegate 属性,除非您实际上是代表:if ([otherObject delegate] == self) [otherObject setDelegate:nil];