问题:关闭文档窗口会产生以下异常:
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
中在Main.storyboard中,
将表格视图(基于视图),2个按钮(“添加”和“删除”)和一个ArrayController拖到视图控制器
ArrayController模式设置为Entity
绑定:
现在第一个问题是绑定ArrayController managedObjectContext。我需要一个Document子类的引用。所以我添加了
weak var document: Document? {
didSet {
print("ViewController, document didSet")
}
}
在ViewController中并将ArrayController托管对象上下文绑定到它(document.managedObjectContext)。
尝试了,但没有成功,在各个地方设置这个var(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。
也许我在这里遗漏了一些明显的东西,但我找不到一个关于如何一起使用故事板,数组控制器和文档的简单示例。顺便说一句,我也试过没有核心数据并得到了同样的例外。
已更新
我做了一个github项目 https://github.com/Miyan0/SimpleApp.git
重现崩溃的步骤:
答案 0 :(得分:0)
看起来解决此问题的唯一方法是将ViewController中的文档引用从弱更改为强。
我担心它可能会导致保留周期,但它不会(根据ViewController和Document的print语句和deinit方法)。我试图涵盖所有可能的情况,即使有时文档在关闭它的窗口后没有被释放,它最终会在创建新文档或修改另一个文档时解除分配。