您好我有以下代码:

- (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的二进制文件。

的问题是,代码运行并返回一个输出,但然后冻结该应用。我通过它线的推移线,发现这条线是问题:

数据= [[输出fileHandleForReading] readDataToEndOfFile];

此线本身被记录的输出到控制台,然后冷冻该应用。我查了一下这个通过删除行之后的所有其他行,它仍然会记录输出和冻结。中没有任何调试器和关于如何解决这个问题的任何建议,将不胜感激。

有帮助吗?

解决方案 2

这个问题的解决方案是简单的,

它是一种已知的错误时执行NSTask毕竟记录不起作用。它返回的输出,它只是不记录它。解决的办法是添加此行:

[task setStandardInput:[NSPipe pipe]];

和一切工作正常:)

其他提示

它看起来像你错过了一个

[proc setStandardOutput:output];

您必须在最后SED声明的末尾一个额外的斜杠。一旦你删除它,该脚本能正常工作。

输出应当与[NSPipe管(无主的),然后输出应该被设置为具有[输出PROC setStandardOutput]标准输出被创建

但你崩溃的原因是因为你释放你没有页头,新的或复制的数据。请参阅内存管理规则的。

此外,请参阅快速问答为NSTask 获得一个很好的清洁执行这一代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top