Cocoa 绑定 - 得到“在键值观察者仍在注册时释放”警告

Posted

技术标签:

【中文标题】Cocoa 绑定 - 得到“在键值观察者仍在注册时释放”警告【英文标题】:Cocoa bindings - getting "deallocated while key value observers were still registered" warnings 【发布时间】:2014-07-30 05:58:54 【问题描述】:

我一直在我的 NSOutlineView 内的 NSTableCellView 中使用 Cocoa 绑定,但将我自己的数据提供给 outlineView objectValueForTableColumn:byItem: 方法(即不使用 NSArrayController 作为内容)。它工作正常,直到我从表中删除一行,在那里我获取托管对象并将其从上下文中删除,并且在 NSManagedObjectContextWillSaveNotification 观察者中,我更新我的数据模型并从大纲视图中删除该行。但是当我这样做时,我会收到以下警告:

类 Log_Log_ 的实例 0x10d922890 在 key 时被释放 价值观察者仍然在其中注册。观察信息是 泄漏,甚至可能被错误地附着在其他物体上。 在 NSKVODeallocateBreak 上设置断点以在调试器中停止。 这是当前的观察信息......

设置断点并不能真正帮助识别问题。我知道有些东西正在观察 Log 上的属性(正在执行绑定的 tableCellView)但是当从大纲视图中删除行时如何清理它?我覆盖了 Log 的 didTurnIntoFault,并且在 self.observationInfo 中得到了一个非零值,但我认为这不能帮助确定此时需要作为观察者移除的观察对象是什么。 我不确定为什么会发生这种情况,以及调试它以找到作为“绑定”观察者的违规对象的最佳方法是什么。

【问题讨论】:

【参考方案1】:

NSTableCellViews 被保存以供重复使用,因此您的僵尸式 cellView 会保留 objectValue。当您删除该行时,您可能希望将单元视图中的 objectValue 清零。

为此使用 NSTableViewDelegate didRemoveRowView:forRow 可能有意义。

【讨论】:

没有帮助,仍然崩溃 @Julian 在设置为零之前尝试明确的unbind。类似于bottom of the page here 的建议。如果这对你有用,我会更新这个“答案”。需要解除绑定的内容可能取决于您的代码。 我发现我也有内存问题,所以解决方案有点隐藏。现在工作了,谢谢

以上是关于Cocoa 绑定 - 得到“在键值观察者仍在注册时释放”警告的主要内容,如果未能解决你的问题,请参考以下文章

需要调试 Cocoa 绑定的技巧

带有核心数据的 Cocoa 绑定不更新所有列

一个窗口中跨多个视图控制器的 Cocoa 绑定

ArrayController 找不到 AppDelegate(Cocoa 中的绑定)

Cocoa - 绑定 - Tableview - 如何计算列的总和

不使用 NSMatrix 的 Cocoa 单选按钮可以绑定吗?