嗨,我有以下代码:
- (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];
此行本身将输出记录到控制台,然后冻结应用程序。我通过删除该行之后的所有其他行来检查这一点,它仍然记录输出并冻结。调试器中没有任何内容,任何有关如何解决此问题的建议将不胜感激。