我的应用程序中有一个 NSPanel,main()
只要按 Escape 键关闭它就会使应用程序崩溃(EXC_BAD_ACCESS in )。以任何其他方式关闭它(文件 > 关闭,Cmd-W,单击红色关闭按钮)工作正常。
通过从故事板实例化其窗口控制器来显示面板。对窗口控制器的引用存储在字典中。在视图控制器的-viewWillDisappear
窗口控制器从字典中删除。
wc = [[NSStoryboard storyboardWithName:@"Main" bundle:nil] instantiateControllerWithIdentifier:kSBIDPreviewWindowController];
// ...
[windowsOfType addObject:wc];
// ...
[wc showWindow:self];
关闭时:
-(void)viewDidDisappear {
// ...
if ([windowsOfType containsObject:winController]) {
[windowsOfType removeObject:winController];
}
}
崩溃显然是通过从字典中删除窗口控制器而触发的。如果我保留它,它就不会崩溃。
一些进一步的信息:
我找不到调试器的问题,因为崩溃发生在 main() 中,即。窗户关闭后。
知道是什么原因造成的吗?
而且,更一般地说,我应该使用哪种技术来调试这种情况?
2018-02-19 更新:
启用僵尸让我得到了消息-[NSWindowController setNextResponder:]: message sent to deallocated instance 0x60000028a9b0
。所以在它被释放后,有东西正在与窗口控制器交谈。由于那不是我的直接代码(我什至没有继承 NSWindowController,也没有在任何地方对窗口控制器进行任何调用),问题仍然存在:与其他方法相比,通过点击 Escape 关闭窗口时有什么不同(像 Cmd-W)?
更新 2018-02-19 #2:
仪器给出了一个有趣的结果。显然,我在面板上的 WebView 尝试在面板关闭/解除分配后处理按下 Escape 键(在我的情况下由视图控制器的-viewDidDisappear
.触发)
Zombie 源是-[WebResponderChainSink detach]
,由 调用(通过一些中间调用)-[WebHTMLView keyDown:]
。
看起来 WebView 没有正确传递按键或其他东西......?这是否意味着面板上的 WebView 是个坏主意?
我找到了避免此类崩溃的解决方案;您必须延迟释放对窗口控制器的最后一个引用,直到完成当前事件处理(dispatch_async()
例如,通过使用)。
这允许 WebView 使用按键来完成它的工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句