如何在不编码 window 状态的情况下以编程方式终止 NSApp?

How to programmatically terminate NSApp without encoding window state?

所有支持 NSWindowRestoration 的 OS X 应用程序都可以通过选择菜单项 "Quit and Close All Windows"(Option-Command Q)来关闭。这会禁用状态恢复,下次您打开应用程序时,所有 windows 都将处于默认位置。

菜单项触发 NSApplication 上的 terminate: 方法。但常规 "Close App" 菜单也是如此(命令 Q)。

如何以编程方式执行 "Quit and Close All Windows"? 我真的必须自己关闭所有 windows 然后调用 terminate: 吗?

当两个操作都连接到同一个 terminate: 方法时,Apple 如何神奇地决定要做什么?

似乎没有很好的方法来做到这一点。您可能希望通过 Apple 请求提交错误(以及您需要它的原因的解释)。

How does Apple magically decide what to do, when both actions are connected to the same terminate: method?

嗯,看看 AppKit 的反汇编,似乎 -[NSApplication terminate:] 检查发送者是否是 NSMenuItem 的实例。如果是,它会检查它的 userInterfaceItemIdentifier 是否等于 @"NSAlternateQuitMenuItem".

我想,您可以创建一个带有该标识符的虚拟菜单项,并将其作为发送者传递给 -terminate:,但由于这依赖于实现细节,它可能随时会中断。

另一个控制因素是系统偏好设置 > 通用 > "Close windows when quitting an app" 的设置。这对应于用户默认键 NSAlternateQuitMenuItem,尽管这又是一个实现细节。看来您可以在调用 -terminate: 之前设置它,然后在 -applicationWillTerminate: 委托方法中删除该设置。 (您的更改将与您的应用程序相关联。它们不会影响其他应用程序或系统偏好设置中的设置。)当然,您必须确保禁用突然终止才能调用该委托方法。