首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSPersistentDocument,Storyboard和NSArrayController =崩溃

NSPersistentDocument,Storyboard和NSArrayController =崩溃
EN

Stack Overflow用户
提问于 2015-10-28 15:38:07
回答 1查看 215关注 0票数 1

Problem:关闭文档窗口会产生以下异常:

代码语言:javascript
复制
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>

代码语言:javascript
复制
-[NSAutoreleasePool drain]: This pool has already been drained, do not release it (double release).

这里我做了什么:

使用以下方法创建一个新的Xcode项目:

  • 使用故事板
  • 创建基于文档的应用程序
  • 使用核心数据

In Document.xcdatamodeld

  • 创建具有两个属性(宽度和长度)的实体(部分)

In Main.storyboard,

  • 将表视图(基于视图)、2个按钮(“添加”和“删除”)和一个ArrayController拖动到视图控制器
  • 将ArrayController模式设置为实体

绑定:

  • tableView内容: ArrayController arrangedObjects,选择索引: ArrayController selectionIndexes
  • 两个表视图单元格绑定到表单元格视图、keyPath: objectValue.width和objectValue.length

现在,第一个问题是绑定ArrayController managedObjectContext。我需要对文档子类的引用。所以我加入了

代码语言:javascript
复制
weak var document: Document? {
    didSet {
        print("ViewController, document didSet")
    }
}

在ViewController中,并将ArrayController托管对象上下文绑定到它(document.managedObjectContext)。

在尝试在不同地方(ViewController.viewDidLoad(),在NSWindowController子类的windowDidLoad()中)设置这个变量但没有成功之后,NSDocumentController.sharedDocumentController().documentForWindow(self.window!)总是为零。

我使用Document.makeWindowControllers()中的以下内容使其工作

代码语言:javascript
复制
if let viewController = windowController.contentViewController {
     viewController.setValue(self, forKey: "document")
}

所以,现在我可以创建一个新的文档,并保存它,打开一个保存的文档,但是一旦我关闭窗口,我就得到了前面的异常。我将deinit方法添加到视图控制器和文档中,异常发生在调用Document.deinit之后,但在ViewController.deinit之前。因此,看起来数组控制器仍然在观察不再存在的文档managedObjectContext。

也许我在这里遗漏了一些显而易见的东西,但是我找不到一个简单的例子来说明如何一起使用故事板、数组控制器和文档。顺便说一句,我也尝试过没有核心数据,并得到了同样的例外。

更新

我做了一个github项目https://github.com/Miyan0/SimpleApp.git

再现坠机的步骤:

  • 创建新文档
  • 保存它
  • 重新打开文档
  • 做任何修改
  • 单击密闭盒(不保存)
  • 崩溃
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-30 14:36:55

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33395352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档