长话短说:
如果我将NSTableView
的高亮样式设置为NSPopover
内的SourceList,则当我关闭包含弹出窗口的窗口时,我的应用程序会崩溃。
长篇故事:
我有一个非常奇怪的问题。
目前使用NSZombie
进行调试似乎导致问题变为NSPopover
,但我并不完全确定,因为我无法在新项目中复制它。
我有一个NSWindow
及其控制器,它创建了一个NSViewController
及其视图(用IB创建的所有内容)。
在此视图中,有一个按钮可打开弹出窗口。
这个popover有一个简单的NSTableView
,其样式设置为SourceList。弹出是暂时的。
如果我打开popover,直接关闭窗口就可以了。 如果我打开弹出窗口,将焦点更改为窗口中的文本字段(以便弹出窗口关闭),然后关闭窗口,应用程序崩溃。
启用僵尸我看到以下日志
*** - [NSPopoverFrame _subviewGeometryChanged:]:发送到解除分配的实例0x1005ce3d0的消息
如果我使用NSZombie
进行个人资料,这就是堆栈:
我每次都可以复制这个问题。我现在将桌面视图的样式改为常规,并且不再发生崩溃(但我失去了对优胜美地的半透明效果。
我不知道会出现什么问题,如果它真的是桌面视图/弹出窗口组合
编辑: 更多信息: 我使用ARC。 问题出现在窗口的重新分配上。 除了打开窗口所需的代码之外,我删除了应用程序的所有代码。在这种情况下也会发生崩溃。
编辑:我可以在新项目中复制此问题。 https://dl.dropboxusercontent.com/u/7968745/PopoverFail.zip我还会向Apple发布错误报告
答案 0 :(得分:0)
根据您的评论回复;在NSPopover
被调用之前,subviewGeometryChanged
被解除分配是个问题。我不知道它什么时候被调用,但是当它发生时它会期待你的NSPopover
存在。
常用气球的一个很好的类比。一个强有力的参考是一个人拿着气球,同时也指着它。一个弱的参考是一个人只是指着一个被其他人持有的气球。因此,如果弱引用指向此气球,并且持有它的人放手,则弱引用将指向nil
。
尝试将NSPopover
属性更改为类型(强)并查看是否为您修复了
答案 1 :(得分:0)
我无法使用您的项目重现错误,但由于我遇到类似问题,我认为我会发布回复(以及可能的解决方案)。如果弹出窗口打开并关闭了它附加的窗口,则需要在视图的dealloc
方法中清理它。这就是我所做的:
- (void)dealloc
{
if (self.thePopover.shown) {
[self.thePopover close]; // forces the popover to close w/o consulting the delegate
self.thePopover.delegate = nil;
self.thePopover = nil;
}
}
这可能会使用大锤来解决问题(如果nil
不会调用它,为什么我需要将委托设置为close
?),但它解决了我的崩溃问题。