gpt4 book ai didi

cocoa - 自终止 MacOS XPC 服务的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-03 16:08:06 28 4
gpt4 key购买 nike

我已成功关注Daemons and Service Guide - Creating XPC Services教程,以及 SandboxedFetch 示例代码,并具有使用新 NSXPCConnection 类的有效客户端/服务设置。

我仍然不完全清楚的是,一旦服务应用程序完成其工作,如何正确地自行终止它。我认识到,在许多情况下,服务预计会保持事件状态,但在我想到的用例中,服务将仅用于执行一些我不会在主应用程序中执行的处理。一旦处理完成,服务应用程序就没有理由保留。如果客户以后需要另一项服务,只需重新创建一项新服务即可。

由于该服务是一个轻量级、非 nibbed 的 NSApplication,因此我尝试通过从 applicationWillTerminate 内部调用 invalidate 来自行终止它>,但这几乎每次都会触发 EXC_BAD_ACCESS 异常。在服务的 [NSXPCListener serviceListener] 上调用 invalidate 会产生稍微不太可靠的崩溃,但它仍然会崩溃。

从客户端应用程序内部的 NSXPCConnection 调用 invalidate 几乎每次都会生成 EXC_BAD_ACCESS 异常。

所以我很好奇彻底关闭 XPC 服务然后退出服务应用程序的正确步骤顺序是什么。理想情况下,服务在对客户端进行最后一次 XPC 调用后会自行终止。

附件是一个异常堆栈跟踪的小屏幕截图。 (是的,这是一个正在服务中加载的 webview。一旦 webview 加载完成,我希望服务自行终止)

enter image description here

最佳答案

我的第一 react 是你不应该费心终止。当出现内存压力并且您的服务空闲时,launchd 将终止您的服务。退出可能不符合任何人的最佳利益,因为您的服务需要时间才能再次启动。不要终止,您就不必找出尝试崩溃的原因。

但是,如果由于某种原因您决定终止,请不要那么努力。只要做任何你需要做的事情来清理(刷新缓冲区,优雅地关闭网络连接,这样服务器就不会受到影响,等等)并调用退出。尽管您似乎正在使用 NSApplication,但您的服务在任何意义上都不是用户关心的应用程序,并且没有令人信服的理由在这方面表现得像一个应用程序。无论如何,主机应用程序都需要能够应对您的服务崩溃,因此您故意毫不客气地退出就可以了。

顺便说一句,在 XPC 服务中使用 NSApplication 可能不是最好的主意,因为没有受支持的方法来声明您想要这样做。这可能有助于解释为什么它不能像您希望的那样工作,尽管本段不应被解释为对崩溃的正确分析。 :-)

关于cocoa - 自终止 MacOS XPC 服务的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23203094/

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