【发布时间】:2014-06-05 20:29:47
【问题描述】:
我已成功遵循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 完成加载,我希望服务自行终止)
【问题讨论】:
-
您是否将您的 XPC 服务建模为启动代理或类似服务?常规 XPC 服务应在需要时自动使用
launchd启动和停止。 -
我使用的 XPC 服务是使用 NSXPCConnection 启动的应用内 XPC 服务。我最终意识到,即使是这些服务也不意味着要明确终止。如果它们空闲,系统将根据需要终止它们。
-
既然您不再担心它的生命周期管理,它确实有效?
标签: cocoa appkit foundation xpc nsxpcconnection