1

嗨,我有以下代码:

- (IBAction)runTask:(id)sender {
    NSTask *proc;
    NSPipe *output;
    NSData *data;
    NSString *buffer;

    proc = [[NSTask alloc] init];
    output = [[NSPipe alloc] init];

    [proc setLaunchPath:@"/bin/sh"];
    [proc setArguments:[NSArray arrayWithObjects: @"-c", @"/usr/bin/otool -L /Applications/TextEdit.app/Contents/MacOS/TextEdit | /usr/bin/awk 'NR>1{print $1}' | /usr/bin/sed -e '/@executable_path/d' -e 's/(.*)$//' -e  's/\\/Versions.*$//'", nil]];
    [proc launch];

    data = [[output fileHandleForReading] readDataToEndOfFile];
    buffer = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
    NSLog(@"got: %@", buffer);

     // Release
     [proc release];
     [output release];
     [buffer release];
     [data release];
}

代码的目的有点复杂,它使用 otool 获取二进制文件使用的共享库列表,然后使用 sed 和 awk 将其过滤为机器可读格式。只是为了测试我使用了 Mac OS X TextEdit.app 的二进制文件。

问题是代码运行并返回输出,但随后冻结了应用程序。我一行一行地浏览它,发现这一行是问题所在:

data = [[输出文件HandleForReading] readDataToEndOfFile];

此行本身将输出记录到控制台,然后冻结应用程序。我通过删除该行之后的所有其他行来检查这一点,它仍然记录输出并冻结。调试器中没有任何内容,任何有关如何解决此问题的建议将不胜感激。

4

4 回答 4

2

看起来你错过了一个

[proc setStandardOutput:output];
于 2009-08-09T00:43:43.873 回答
1

这个问题的解决方法很简单,

这是一个已知的错误,即在执行 NSTask 后,所有日志记录都不起作用。它正在返回一个输出,只是没有记录它。解决方案是添加这一行:

[task setStandardInput:[NSPipe pipe]];

一切正常:)

于 2009-08-17T18:33:57.390 回答
0

在最后一个 sed 语句的末尾有一个额外的斜杠。删除它后,脚本就可以正常工作。

于 2009-08-09T02:24:03.240 回答
0

应使用 [NSPipe pipe] (unowned) 创建输出,然后应使用 [proc setStandardOutput: output] 将输出设置为标准输出

但是你崩溃的原因是因为你正在释放你没有分配、新建或复制的数据。请参阅内存管理规则

此外,请参阅NSTask 的 Quickies以获得此代码的干净利落的实现。

于 2009-08-09T10:41:36.270 回答