こんにちは私は次のコードを持っています:
- (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 OSXTextEdit.appのバイナリを使用しました。
問題は、コードが実行されて出力が返されるが、アプリがフリーズすることです。私はそれを一行ずつ調べて、この行が問題であることがわかりました:
data = [[output fileHandleForReading] readDataToEndOfFile];
この行自体は、出力をコンソールに記録してからアプリをフリーズしています。その行の後の他のすべての行を削除してこれを確認しましたが、それでも出力がログに記録されてフリーズします。デバッガーには何もありません。この問題を解決する方法についての提案をいただければ幸いです。