gpt4 book ai didi

objective-c - 为什么通过按Escape关闭NSPanel时我的应用程序崩溃?

转载 作者:行者123 更新时间:2023-12-03 17:44:10 29 4
gpt4 key购买 nike

我的应用程序中有一个NSPanel,每当通过按Escape键将其关闭时,该应用程序就会崩溃(main()中的EXC_BAD_ACCESS)。以任何其他方式(文件>关闭,Cmd-W,单击红色的关闭按钮)关闭它都可以正常工作。

通过从 Storyboard 上实例化其窗口 Controller 来显示该面板。对窗口 Controller 的引用存储在字典中。在 View Controller 的-viewWillDisappear中,窗口 Controller 从字典中删除。

    wc = [[NSStoryboard storyboardWithName:@"Main" bundle:nil] instantiateControllerWithIdentifier:kSBIDPreviewWindowController];
// ...
[windowsOfType addObject:wc];
// ...
[wc showWindow:self];

收盘价:
-(void)viewDidDisappear {
// ...
if ([windowsOfType containsObject:winController]) {
[windowsOfType removeObject:winController];
}
}

崩溃显然是通过从字典中删除窗口 Controller 触发的。如果我保留它,它不会崩溃。

一些进一步的信息:
  • 该面板包含(仅)一个WebView。
  • 面板的“关闭时释放”复选框已关闭
  • 所有其他选项均为默认设置(除了“启用时关闭隐藏”功能之外)。

  • 我找不到调试器的问题,因为崩溃发生在main()中,即。窗口关闭后。

    知道是什么原因造成的吗?

    而且,更一般而言,我应该使用哪种技术来调试这种情况?

    更新于2018-02-19:

    启用僵尸使我得到了消息 -[NSWindowController setNextResponder:]: message sent to deallocated instance 0x60000028a9b0。因此,在释放窗口 Controller 之后,正在与之对话。由于那不是我的直接代码(我什至没有子类化NSWindowController,也没有在任何地方对窗口 Controller 进行任何调用),因此问题仍然存在:与其他方法相比,通过按Escape关闭窗口时有什么不同(像Cmd-W)?

    更新于2018-02-19#2:

    仪器给出了有趣的结果。显然,我在面板上拥有的WebView在关闭/释放面板后试图处理Escape键的按下(在我的情况下,由 View Controller 的 -viewDidDisappear触发)。

    僵尸源代码为 -[WebResponderChainSink detach],由 -[WebHTMLView keyDown:]调用(通过一些中间调用)。

    看来WebView没有正确传递按键或其他东西?这是否意味着在面板上使用WebView是一个坏主意?

    最佳答案

    我找到了避免此类崩溃的解决方案。您必须将对窗口 Controller 的最后一个引用的发布延迟到当前事件处理完成之后(例如,使用dispatch_async())。

    这使得WebView可以通过按键来完成其任务。

    关于objective-c - 为什么通过按Escape关闭NSPanel时我的应用程序崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48825902/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com