我有一个 Mac 应用程序,当应用程序关闭时,它的 applicationWillTerminate:(NSNotification *) 处理程序不会被调用。如果程序关闭,必须调用一些 c++ 内存清理代码,所以我需要一些方法来执行此操作。
它没有被调用的原因似乎与我在 Info.plist 中添加以下键有关:
<key>LSUIElement</key>
<true/>
我已阅读有关此主题的其他问题和答案,例如applicationWillTerminate: not being called和applicationWillTerminate not called(接受的正确答案无效)。applicationDidEnterBackground() 也永远不会被触发。applicationDidFinishLaunching() 总是可以正常触发。如果 applicationShouldTerminate() 曾经被调用,我会返回 NSTerminateNow,但它也没有被调用。
对于好奇的人,该应用程序是 Chrome 原生消息传递主机,并以编程方式启动。如果管道关闭,它可以在我身上关闭,所以我真的需要某种事件或通知或能够可靠地让我在关闭时执行一些代码的东西。如果用户使用 Command-Tab,我的应用程序需要保持不可见并且不需要出现在应用程序切换器中。
更新:
我从一开始就注意到,当我从活动监视器终止我的应用程序时,控制台应用程序中记录了以下内容:
com.apple.xpc.launchd[1]: (com.allinlearning.ailhost.67908[13017]) Service exited due to signal: Terminated: 15
这与 Peter Hosey 对这个 SO 问题的回答直接相关:applicationWillTerminate 不会被调用。所以我立即将 NSSupportsSuddenTermination 键添加到我的 Info.plist 以禁用突然终止,希望(正如彼得的回答所暗示的那样) applicationWillTerminate 将有时间触发。唉,它没有。但它也许确实澄清了一些事情。如果该控制台语句确实意味着我的应用程序正在被终止,那么我怎样才能有机会在 The End 之前执行一些代码?