Problem:关闭文档窗口会产生以下异常:
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项目:
In Document.xcdatamodeld
In Main.storyboard,
绑定:
现在,第一个问题是绑定ArrayController managedObjectContext。我需要对文档子类的引用。所以我加入了
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之前。因此,看起来数组控制器仍然在观察不再存在的文档managedObjectContext。
也许我在这里遗漏了一些显而易见的东西,但是我找不到一个简单的例子来说明如何一起使用故事板、数组控制器和文档。顺便说一句,我也尝试过没有核心数据,并得到了同样的例外。
更新
我做了一个github项目https://github.com/Miyan0/SimpleApp.git
再现坠机的步骤:
发布于 2015-10-30 14:36:55
解决这个问题的唯一方法是将ViewController中的文档引用从弱更改为强。
我担心它可能会导致保留周期,但它不会(根据ViewController和Document的print语句和deinit方法)。我试图涵盖所有可能的情况,即使有时在关闭它的窗口后文档没有被释放,当一个新文档被创建或者另一个文档被修改时,它最终也会被释放。
https://stackoverflow.com/questions/33395352
复制相似问题