2015-01-05 52 views
1

我的父应用程序使用助手XPC来完成某些任务T1。 XPC服务使用NSXPCConnection实现。 一旦任务完成,我不需要这个XPC活着。因此,父进程在NSXPCConnection对象上调用invalidate。 但是,即使连接无效,XPC仍然存在。我可以看到它在Activity Monitor中列出。父应用程序仍在运行时终止XPC

当父应用程序仍在运行并且不需要XPC保持活动状态时,如何杀死此XPC?

回答

0

XPC代理设计意味着长寿。 当它们根据.plist配置中的KeepAlive设置退出或崩溃时,它们会自动重新加载。

也许你可以为NSWorkspace事件观察员注册:

[[NSWorkspace sharedWorkspace] notificationCenter]; 

见: NSWorkspace 工作区的通知的发布时间:

  • 应用程序启动和终止

然后,您可以禁用您的XPC服务当您的父应用程序启动时退出并重新启用它。

0

要清楚,当父应用程序退出时,您的XPC进程将退出。至少,我的确如此。你的问题是:如何在此之前杀死它?

这很简单:只要在XPC进程中调用exit(0)后立即调用完成处理程序,该处理程序将输出发送回父应用程序。我需要在上个月的一个项目中这样做,因为XPC过程使用的是Apple私有框架,并且退出它是我能够阻止某个不受欢迎的且无法解释的唯一方法(因为我没有私有文档框架)副作用。然而,在退出这个XPC过程时,我发现奇怪的是,它继续运行几毫秒,如果我的父应用程序在此期间打开另一个连接到同一个XPC服务,注定的XPC过程将接受新的连接就在自杀之前,让父应用程序挂起。我已经看到过这种情况。

所以,后续的问题是:你是否应该因为想变得更好而杀了它?我认为答案是没有,据来自苹果公司的Daemons and Services Programming Guide > Creating XPC Services

XPC服务以下报价由launchd会进行管理,这将启动他们的需求, 重新启动他们,如果他们崩溃,并终止他们(通过发送SIGKILL) 当它们空闲时。

总结:完成时只需使连接无效,让launchd担心会导致死机。另外,别屏住呼吸。我已经让我的应用程序在过去两个小时内运行,并且两小时前关闭的XPC进程仍处于运行状态。

相关问题