我设法创建了一个可可程序正在退出的bug。
- 显然没有调用[NSApplication terminate:]。
也不是 - [NSException init]。
没有崩溃。我在gdb中看到的是,直接从NSApplicationMain调用exit()而不通过正常的[NSApplication terminate]路径。
有关如何调试此和/或如何(看似“不可能”的行为)可能发生的任何想法?
提前感谢可可新手。
答案 0 :(得分:4)
我会从明智地使用断点开始。将它缩小到最后一个在仿制崩溃之前看到代码的位置,然后开始查看该区域的内存问题。每当我有非常奇怪的行为时,几乎完全是由于一个奇怪的记忆错误。
答案 1 :(得分:2)
很少有剩余路由会导致您的应用程序在不经过正常[NSApplication terminate]路径的情况下自愿退出。
尝试在“停止:”上设置断点。我怀疑某种程度上,也许是一个不恰当命名的performSelector调用?或者命名错误的IB连接,您正在调用此方法,该方法被记录为退出主事件循环。
答案 2 :(得分:0)
在仔细考虑之后我猜到我在“大局”中做错了什么。因此,“在大图中”,我正在做的是调用模式对话框(通过加载窗口笔尖,显示窗口然后使用[NSApplication beginModalSessionForWindow] ... [NSApp runModalSession] ...并在关闭时[NSApp] endModalSession]。这对我来说在其他代码块中没有什么大不了的。关键的差异是这个模态窗口正在加载并运行另一个类的awakeFromNib。
我写了一个简单的应用程序来重现这种行为。所以会发生的情况是模态对话框快速加载,当你关闭模态窗口时,它不仅会关闭,而且还会退出应用程序。我想这是一个“按设计”的行为。我正在apple docs阅读,看看我是否能理解为什么会这样,但我会对此感到困惑。我猜测我的对话框的模态事件循环以某种方式劫持了应用程序的事件循环,以便在对话结束时应用程序结束。
如果有人对这个错误有更好的理解,请随时启发我们......
感谢大家的阅读和建议。
答案 3 :(得分:0)
PS - 我改变了我的代码以使用[NSApplication runModalForWindow:]而不是模态会话调用,一切都很好(我认为)。 (使用模态会话将允许我从模式对话框启动Web浏览器 - 而runModalForWindow不会 - 但在这种情况下我不需要该功能。)