使用NSTask:应用冷冻回国后输出
-
12-09-2019 - |
题
您好我有以下代码:
- (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 获得一个很好的清洁执行这一代码。
不隶属于 StackOverflow