2015-10-28 54 views
1

問題 NSArrayController的=墜毀:關閉文檔窗口產生以下異常:NSPersistentDocument,故事情節和密切

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 arrangedObjects,選擇索引:ArrayController selectionIndexes
  • 2表視圖細胞結合到表格單元格視圖,的keyPath:objectValue.width和objectValue.length

現在第一個問題是綁定ArrayController managedObjectContext。我需要對Document子類的引用。所以,我在ViewController中添加

weak var document: Document? { 
    didSet { 
     print("ViewController, document didSet") 
    } 
} 

和綁定的ArrayController管理對象上下文給它(document.managedObjectContext)。

嘗試,但沒有成功,設置在不同的地方)這個VAR(ViewController.viewDidLoad(在一個NSWindowController子類的windowDidLoad()後,NSDocumentController.sharedDocumentController().documentForWindow(self.window!)總是爲零。

我做了它的工作使用文檔以下.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

重現崩潰的步驟:

  • 創建一個新文檔
  • 將它保存
  • 重開文件
  • 進行任何修改
  • 點擊closebox(不保存)
  • 崩潰
+0

請提供示例代碼,以便更容易地爲您提供幫助。 –

+0

謝謝Marek,我更新了這篇文章。我認爲問題在於文檔的autosavesInPlace,但即使設置爲false,如果關閉修改的文檔並在保存對話框中選擇「不保存」,我可以使應用程序崩潰。 – amasse

+0

它給我這個警告http://imgur.com/MgBtblX,它崩潰後 –

回答

0

貌似解決,這是通過改變由弱到強的文檔中的ViewController參考的唯一途徑。

我擔心它可能會導致保留週期,但它不會(根據ViewController和Document的打印語句和deinit方法)。我試圖涵蓋所有可能的情況,即使有時文檔在關閉它的窗口後也沒有被釋放,它最終會在創建新文檔或修改其他文檔時解除分配。

相關問題