通过一对一关系绑定时文档关闭时崩溃

Posted

技术标签:

【中文标题】通过一对一关系绑定时文档关闭时崩溃【英文标题】:crash on document close when binding trough one-to-one relationship 【发布时间】:2015-08-31 01:53:28 【问题描述】:

构建环境:Xcode 7 beta 7 OS X:10.10.5 斯威夫特 2

我有一个项目使用来自 github 的 BSManagedDocument 类将核心数据包装到 NSDocument 中。我正在使用 Cocoa 绑定将数据从核心数据获取到使用 NSTree 控制器的 NSOutlineView。

对象模型相当简单。绑定到树控制器的对象(称为 SourceGroup_)与其自身具有一对多关系,为树控制器提供分层数据。它还与提供 URL 的 Media 对象具有可选的一对一关系相关媒体(图片、视频等)。

大纲视图绑定了三列,两列绑定到主对象的属性,第三列是来自一对一媒体关系的缩略图。

一切都显示得很好,但是当我关闭文档时,我在 _NSGetUsingKeyValueGetter 中得到一个 EXC_BAD_ACCESS,它通过 NSAutoUnbinder 和 [NSTableCellView release] 返回到 [NSAutoreleasePool drain]。这不是每次都会发生,但偶尔会发生。

如果我删除了通过一对一关系绑定的列,它永远不会崩溃。如果我在 SourceGroup 上添加一个非核心数据属性,该属性只是从首选媒体关系返回图像,然后绑定到 SourceGroup 上的该属性,它永远不会崩溃。

字段的类型无关紧要。如果我通过关系绑定,它(有时)会在关闭时崩溃,无论是 String 还是 NSImage。

我什至尝试将我的核心数据对象生成为 Objective C 而不是 Swift,但这对行为没有影响。无论我如何更改一个常量,如果我通过关系绑定表列中的视图,它有时会在关闭时崩溃。然而,在细节方面,如果我通过 selectionIndex 绑定到相同的字段,它可以正常工作并且永远不会崩溃。只有在大纲视图中才会发生崩溃。

我知道描述可能有点模糊,所以我准备了一些屏幕截图,不幸的是我似乎缺乏足够的声誉来分享它们。我将尝试描述设置。

树控制器处于实体模式,实体设置为 SourceGroup。它的源描述符和托管对象上下文绑定到我的视图控制器。

大纲视图的内容绑定到树控制器的arrangedObjects 控制器键。 selectionIndexPaths 和排序描述符也绑定到树控制器。

列中 NSImageView 的值绑定到表格单元格视图,模型键路径设置为 objectValue.preferredMedia.thumbnail。

这一切都可以正常显示,但会导致关闭文档时出现间歇性问题。如果我将缩略图图像属性放入 SourceGroup,然后将该图像视图绑定到 objectValue.thumbnail,我永远不会看到问题

我在文档中没有看到任何关于这种类型的设置存在问题的内容,但我对 OS X 编程也很陌生,可能错过了一些东西。

任何人都可以看到我正在尝试做的事情的问题吗?

【问题讨论】:

【参考方案1】:

我在 Core Data、treecontroller 和图像方面遇到了类似的问题。托管对象上下文在大纲视图和树控制器之前释放。在绑定移除其观察者之前,上下文将托管对象转变为故障。 一种解决方法是在窗口关闭时将 treecontroller 的内容设置为 nil。

【讨论】:

+1。我发现explicit unbinding could also help. 暂时,这似乎有效(在视图控制器的 viewWillDisappear 方法中,treeController.content = nil)。我已经运行了 20 次左右的打开/关闭循环,没有出现错误,如果没有更改,它通常会在 10 内失败。谢谢!我正要失去我的最后一块大理石,试图找到一种理智的方法来解决这个问题。

以上是关于通过一对一关系绑定时文档关闭时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

将一对多核心数据关系的前 5 个值绑定到文本字段

Code First - 自引用一对多关系

为啥 Hibernate 文档建议将连接表用于一对多关系?

父/子和一对一/对多反向关系之间的核心数据差异

数据库规范化一对一关系[关闭]

使用反向字段时自动创建一对一关系