窗口关闭时NSPopover崩溃

时间:2015-02-14 21:52:10

标签: objective-c macos cocoa nswindow nspopover

长话短说:

如果我将NSTableView的高亮样式设置为NSPopover内的SourceList,则当我关闭包含弹出窗口的窗口时,我的应用程序会崩溃。

编辑:我可以在新项目中复制此问题。 https://dl.dropboxusercontent.com/u/7968745/PopoverFail.zip

长篇故事:

我有一个非常奇怪的问题。 目前使用NSZombie进行调试似乎导致问题变为NSPopover,但我并不完全确定,因为我无法在新项目中复制它。

我有一个NSWindow及其控制器,它创建了一个NSViewController及其视图(用IB创建的所有内容)。 在此视图中,有一个按钮可打开弹出窗口。 这个popover有一个简单的NSTableView,其样式设置为SourceList。弹出是暂时的。

如果我打开popover,直接关闭窗口就可以了。 如果我打开弹出窗口,将焦点更改为窗口中的文本字段(以便弹出窗口关闭),然后关闭窗口,应用程序崩溃。

启用僵尸我看到以下日志

  

*** - [NSPopoverFrame _subviewGeometryChanged:]:发送到解除分配的实例0x1005ce3d0的消息

如果我使用NSZombie进行个人资料,这就是堆栈:

Instrument stack

我每次都可以复制这个问题。我现在将桌面视图的样式改为常规,并且不再发生崩溃(但我失去了对优胜美地的半透明效果。

我不知道会出现什么问题,如果它真的是桌面视图/弹出窗口组合

编辑: 更多信息: 我使用ARC。 问题出现在窗口的重新分配上。 除了打开窗口所需的代码之外,我删除了应用程序的所有代码。在这种情况下也会发生崩溃。

编辑:我可以在新项目中复制此问题。 https://dl.dropboxusercontent.com/u/7968745/PopoverFail.zip

我还会向Apple发布错误报告

2 个答案:

答案 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?),但它解决了我的崩溃问题。