【问题标题】:NSPersistentDocument, Storyboard and NSArrayController = crash on closeNSPersistentDocument、Storyboard 和 NSArrayController = 关闭时崩溃
【发布时间】: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


【解决方案1】:

看起来解决这个问题的唯一方法是将 ViewController 中的文档引用从弱更改为强。

我担心它可能会导致保留周期,但它不会(根据 ViewController 和 Document 的 print 语句和 deinit 方法)。我试图涵盖所有可能的情况,即使有时文档在关闭它的窗口后没有被释放,它最终也会在创建新文档或修改另一个文档时被释放。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 2015-06-02
    • 1970-01-01
    相关资源
    最近更新 更多