【发布时间】:2015-10-28 15:38:07
【问题描述】:
问题:关闭文档窗口会产生以下异常:
An instance 0x600000140630 of class SimpleApp.Document was deallocated while key value
observers were still registered with it. Current observation info: <NSKeyValueObservationInfo 0x6100000424f0> …
<NSKeyValueObservance 0x6100000c2f40: Observer: 0x6280000c7a10, Key path: managedObjectContext, Options: <New: NO, Old: NO, Prior: NO> Context: 0x0, Property: 0x6100000429a0>
和
-[NSAutoreleasePool drain]: This pool has already been drained, do not release it (double release).
这是我所做的:
使用以下方法创建了一个新的 Xcode 项目:
- 使用故事板
- 创建基于文档的应用程序
- 使用核心数据
在 Document.xcdatamodeld 中
- 创建了一个具有宽度和长度 2 个属性的实体(部分)
在 Main.storyboard 中,
将一个表格视图(基于视图)、2 个按钮(“添加”和“删除”)和一个 ArrayController 拖到视图控制器中
ArrayController 模式设置为实体
绑定:
- tableView 内容:ArrayController 排列对象,选择索引:ArrayController selectionIndexes
- 2 个表格视图单元格绑定到表格单元格视图,keyPath:objectValue.width 和 objectValue.length
现在第一个问题是绑定ArrayController managedObjectContext。我需要对 Document 子类的引用。所以我加了
weak var document: Document? {
didSet {
print("ViewController, document didSet")
}
}
在 ViewController 中并将 ArrayController 托管对象上下文绑定到它(document.managedObjectContext)。
尝试在不同的地方设置这个变量(ViewController.viewDidLoad() ,在 NSWindowController 子类的 windowDidLoad() 中,NSDocumentController.sharedDocumentController().documentForWindow(self.window!) 始终为零。
我在 Document.makeWindowControllers() 中使用以下内容使其工作
if let viewController = windowController.contentViewController {
viewController.setValue(self, forKey: "document")
}
所以,现在我可以创建一个新文档,然后保存它,打开一个保存的文档,但是一旦我关闭窗口,我就会得到以前的异常。我在视图控制器和文档中添加了 deinit 方法,异常发生在调用 Document.deinit 之后但在 ViewController.deinit 之前。所以看起来数组控制器仍在观察不再存在的 Document managedObjectContext。
也许我在这里遗漏了一些明显的东西,但我找不到一个简单的例子来说明如何一起使用故事板、数组控制器和文档。顺便说一句,我也尝试过不使用 Core Data 并得到了同样的异常。
更新
我做了一个 github 项目 https://github.com/Miyan0/SimpleApp.git
重现崩溃的步骤:
- 创建一个新文档
- 保存
- 重新打开文档
- 进行任何修改
- 点击关闭框(不保存)
- 崩溃
【问题讨论】:
-
请提供示例代码,以便为您提供帮助。
-
谢谢 Marek,我已经更新了帖子。我认为问题出在文档的 autosavesInPlace 但即使设置为 false,如果我关闭修改后的文档并在保存对话框中选择“不保存”,我也会使应用程序崩溃。
-
它在崩溃后给了我这个警告imgur.com/MgBtblX
-
注意:绑定仍在连接时的 setNil 可能是崩溃的根源
-
嗯,这很奇怪。我从来没有收到这个警告......关于为数组控制器 managedObjectContext 设置 nil,无论有没有它,我都会得到相同的异常。这是试图粉碎这个错误。我在 El Capitan 10.11.1 顺便说一句。
标签: macos cocoa-bindings nsdocument