Objective c 构建后台应用程序作为启动守护程序的缺点?

Objective c 构建后台应用程序作为启动守护程序的缺点?,objective-c,macos,cocoa,Objective C,Macos,Cocoa,在没有任何GUI的情况下构建只支持后台的COCOA应用程序并将其作为启动守护程序运行是否有任何缺点。这将使用: import <Foundation/Foundation.h> import <AppKit/AppKit.h> import <CoreData/CoreData.h> 导入 进口 进口 使用此工具而不构建objective-C命令行工具的主要优点是,它提供了隐式运行循环,其好处包括在应用程序启动或终止时定义良好的回调。这需要在命令行应用程序

在没有任何GUI的情况下构建只支持后台的COCOA应用程序并将其作为启动守护程序运行是否有任何缺点。这将使用:

import <Foundation/Foundation.h>
import <AppKit/AppKit.h>
import <CoreData/CoreData.h>
导入
进口
进口
使用此工具而不构建objective-C命令行工具的主要优点是,它提供了隐式运行循环,其好处包括在应用程序启动或终止时定义良好的回调。这需要在命令行应用程序中显式实现


是否存在诸如功能中断之类的缺点?守护进程的启动会被推迟吗?

对于守护进程,使用任何非守护进程安全框架都有严重的缺点。发件人:

分层框架 大多数Mac OS X功能是由大型系统框架实现的。 这些框架中的许多都使用他们查找的基于马赫数的服务 使用引导服务。这可能会导致各种各样的问题,如果 您从引用错误引导的程序调用它们 命名空间

苹果解决这个问题的方法是分层:我们划分框架 并为每个层决定该层是否支持 全局引导命名空间中的操作。基本规则是 CoreServices及以下版本中的所有内容(包括系统、IOKit、系统 配置、基础)应在任何引导命名空间中工作 (这些是守护进程安全框架),而 CoreServices(包括ApplicationService、Carbon和AppKit) 需要每个会话引导命名空间的GUI

总之,具体建议如下:

  • 编写守护程序时,仅链接到守护程序安全框架(请参阅)

  • 编写GUI代理时,您可以链接到任何框架

  • > p>如果编写守护进程,并且必须链接一个不是守护程序安全的框架,请考虑将代码拆分为守护进程。 组件和代理组件。如果不可能,请注意 与将守护程序链接到不安全服务器相关的潜在问题 框架(如下一节所述)

危险地生活 如果您的守护程序使用的框架不是守护程序安全的,那么您可以运行 陷入各种各样的问题

  • 有些框架在加载时失败。也就是说,框架有一个初始化例程,该例程假定它在每个会话中运行 上下文,否则将失败

    这个问题在当前系统上很少见,因为大多数框架都是延迟初始化的

  • 如果框架在加载时没有失败,那么在从该框架调用各种例程时仍然可能会遇到问题

    • 例行公事可能会失败。例如,例程可能会以静默方式失败,或者将消息打印到stderr,或者可能返回 有意义的错误代码

    • 例行公事可能会失败。例如,如果GUI框架是由守护进程运行的,则调用abort是非常常见的

    • 即使例程的框架不是正式的守护进程安全的,它也可以工作

    • 根据其输入参数,例程的行为可能会有所不同。例如,图像解压缩例程可能适用于 某些类型的图像和其他类型的图像失败

  • 任何给定框架的行为,以及该框架内的例程,都可能随着版本的变化而变化

结果是,如果您的守护进程与框架链接 这是不安全的,您无法预测它在中的行为 将军。它可能在您的计算机上工作,但在其他用户的计算机上失败 或在未来的系统版本中出现故障,或在不同的系统版本中出现故障 输入数据。你活得很危险


阅读整个技术说明以了解全部细节。

如果只是背景,那么为什么需要Cocoa?因为我使用的是依赖于AppKit的NapplicationElegate,您不需要它。我写了一篇文章,它允许您在命令行实用程序中使用Objective-C/Foundation(可以很容易地修改为守护进程)。好的,但是在launchdaemon中使用NsapplicationLegate和Cocoa框架有什么缺点吗?因为它使事情变得非常精简和简单。这是主要的问题,你使用的是一个非常大的框架的一小部分。如果你想使用基础类,那么你需要一个运行循环(RunLoopController进来的地方),并且任何其他的代码< NSpoundation委托> <代码>都可以很容易地用你自己的代码来替换(见一些与RunLoopController捆绑在一起的例子来决定何时终止)。谢谢你的解释。您能指出列出了守护进程安全框架的文档吗?这是什么地方:(参见框架交叉引用)?它紧跟在我链接并引用的文档部分之后,但我将使用链接进行编辑。