【发布时间】:2014-11-29 08:57:45
【问题描述】:
升级到 Yosemite 后,应用程序在使用 NSOutlineView 关闭 NSSheet 时崩溃。
例外是访问不正确。 似乎表的数据源发布得太早了。 数据源绑定在xib文件中,它是File Owner,一个NSWindowController。该表的填充覆盖了数据源方法。
这是异常堆栈:
【问题讨论】:
标签: objective-c macos cocoa osx-yosemite
升级到 Yosemite 后,应用程序在使用 NSOutlineView 关闭 NSSheet 时崩溃。
例外是访问不正确。 似乎表的数据源发布得太早了。 数据源绑定在xib文件中,它是File Owner,一个NSWindowController。该表的填充覆盖了数据源方法。
这是异常堆栈:
【问题讨论】:
标签: objective-c macos cocoa osx-yosemite
我刚刚用 NSSheet 上的 NSTableView 解决了同样烦人的问题。我在优胜美地之前工作的代码是这样的:
[self.mainWindowController.window endSheet:self.fileRenamingWindowController.window];
self.fileRenamingWindowController = nil;
我会关闭工作表并清除不必要的窗口控制器——就像优胜美地之前的魅力一样。
然而,现在窗口和相应的视图层次似乎并没有与 endSheet: 同步销毁,所以在上面的代码中,当窗口控制器被释放时,窗口的内容会在短时间内超过它(可能直到关闭动画完成),例如导致 EXC_BAD_ACCESS NSTableView 将销毁的窗口控制器作为其委托/数据源。我通过覆盖窗口控制器的 dealloc 方法解决了这个问题,以确保没有人(即 tableView)通过弱引用持有它:
self.tableView.delegate = nil;
self.tableView.dataSource = nil;
【讨论】: