退出应用程序的方式之间的区别:exit()、NSApp/NSApplication 终止

Posted

技术标签:

【中文标题】退出应用程序的方式之间的区别:exit()、NSApp/NSApplication 终止【英文标题】:Difference between ways to quit an application: exit(), NSApp/NSApplication terminate 【发布时间】:2014-08-12 07:23:21 【问题描述】:

我在网上查找了如何退出应用程序,但我发现了很多相互矛盾的答案。不同的人提出了以下建议,每个人都有不同的原因:

exit(0);

[NSApp terminate:self];

[NSApp terminate:nil];

[[NSApplication sharedApplication] terminate:self];

作为 Objective-C 的新手,所有这些对我来说似乎都很合理。每种方法何时最适合使用?

【问题讨论】:

除了第一个选项,我很确定他们都做同样的事情,应该都能正常工作。 是的,普遍的共识似乎是你永远不应该退出(0)。为什么 exit(0) 这么糟糕? 【参考方案1】:

所有这些:

[NSApp terminate:self];

[NSApp terminate:nil];

[[NSApplication sharedApplication] terminate:self];

做同样的事情。 NSApp 是一个保存应用程序对象的全局变量。 [NSApplication sharedApplication] 返回应用程序对象,或者,如果这是第一次调用,则创建它然后返回它。如果您正在考虑退出应用,这几乎肯定不是第一次调用。

-terminate: 方法忽略参数 (sender)。它需要一个参数的唯一原因是它是一个动作方法,这是动作方法的一般形式。

请注意,-terminate: 不会简单地退出应用程序。如果已实现,它将调用应用程序委托的 -applicationShouldTerminate: 方法。根据返回码,代表可以取消终止或推迟决定。如果决定被推迟,应用程序将在等待它的特殊模式下运行。

最后,如果应用程序确实(最终)终止,NSApplication 将发布NSApplicationWillTerminateNotification 通知。如果应用程序委托实现-applicationWillTerminate:,则将作为发布该通知的结果调用。代表可以做一些最后的清理。除了委托之外,该通知的任意其他观察者都希望有机会进行清理。

致电exit(0) 不会提供任何机会。

【讨论】:

谢谢!如果您不介意,那么直接将退出按钮链接到终止:在 XCode 中呢?和 exit(0) 的效果一样吗? 不调用-terminate:exit(0) 的效果相同。您可以将按钮连接到-terminate: 操作方法。这就是为什么它是一种行动方法。标准退出菜单项连接到-terminate:。连接到它的按钮的行为与该菜单项完全相同。

以上是关于退出应用程序的方式之间的区别:exit()、NSApp/NSApplication 终止的主要内容,如果未能解决你的问题,请参考以下文章

调用“ret”与调用sys_exit数字程序集gcc之间有什么区别

PHP中的die()和exit()有啥区别?

python中 os._exit() 和 sys.exit(), exit和exit 的用法和区别

程序代码中退出函数exit()与返回函数return ()的区别

on_exit() 和 atexit() 函数之间有区别吗?

C语言中exit(0)与exit(1)有啥区别??