NSTask vs System - 优点和缺点?

时间:2013-05-13 18:40:42

标签: objective-c nstask

我正处于需要调用系统命令的项目中。我最初开始关注NSTask(因为这似乎是最流行的方法),但最近我遇到了system命令。它看起来像NSTask更容易设置。我看到一些问题/答案说NSTask是更好的方法,但我没有看到

  1. 两者之间有哪些优点/缺点
  2. 在哪种情况下,比其他人更可能使用
  3. 任何帮助/链接/想法/想法? (是的..我做了谷歌搜索)

2 个答案:

答案 0 :(得分:8)

NSTask

  • 可以在后台运行他的任务。允许您向基础进程发送中断和终止,并允许您暂停或恢复基础进程,而无需自行设置线程。如果这是你想要的,也可以同步运行。
  • 让我们来回使用Cocoa类,比如NSString s,而不必进行包层转换。
  • 让我们设置与调用者不同的基础流程的I / O流。
  • 所有Apple平台(如iOS)都比system(3)更好地支持 - 我认为system甚至不适用于iOS。
  • 需要Cocoa和Objective-C。
  • 不解释shell参数或执行参数的路径扩展。

system(3)

  • 更好地支持所有类Unix平台。
  • 可以使用单行运行任务。
  • 只需要C。
  • 在shell中运行,将解释工作目录和/bin/sh之类的参数。

对于Cocoa应用程序,我总是使用NSTask;我只使用system如果我正在做一些必须只有C的东西,或者我知道必须在非Mac环境下运行。事实上,system非常脆弱,而且更强大的解决方案是fork - exec,因为它允许您更多地控制流和并发操作。

答案 1 :(得分:7)

存在一些差异。对于其中一些人来说,一般来说,这是否有利可能是很难说的。

  • system()启动一个shell。 NSTask没有。
  • system()阻止。 NSTask异步运行。
  • system()只接受args。 NSTask适用于管道。
  • system()只有一个整数退出代码。 NSTask适用于管道。 (是的,再次提到。这是为了输出。)
  • system()需要一个完整的命令行。 NSTask args可以在数组中传递。
  • system()在当前目录上运行。要NSTask,您可以传递工作目录。

如果不重新检查文档,这是我的一些不同之处。这是一个概述。