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];
}
コードの目的は、それがバイナリで使用される共有ライブラリのリストは、それは機械読み取り可能なフォーマットにそれをフィルタリングするためのsedやawkの使用を取得するコマンドotoolを使用して、ちょっと複雑です。ただ、テストするために、私は、Mac OS X TextEdit.appのバイナリを使用しました。
問題は、コードが実行され、出力を返しますが、その後アプリをフリーズということです。私はラインでそれラインを経て、この行が問題であることが判明します:
データ= [出力fileHandleForReading] readDataToEndOfFile];
このライン自体は、コンソールに出力をログに記録してからアプリを凍結されます。私は、その行の後に他のすべての行を削除することによって、これを確認し、そしてそれはまだ出力とフリーズをログに記録します。そこは何もデバッガではありませんし、この問題を解決する方法上の任意の提案をいただければ幸いです。
解決 2
この問題を解決するには簡単だった、
NSTaskが実行された後、すべてのログが動作しないことをその既知のバグ。そのはちょうどそれをロギングない、出力を返しています。ソリューションは、この行を追加することでした。
[task setStandardInput:[NSPipe pipe]];
そして、すべてが正常に動作します:)
他のヒント
に見えます
[proc setStandardOutput:output];
あなたは最後のsed文の末尾に余分なスラッシュを持っています。あなたはそれを削除すると、スクリプトが正常に動作します。
出力は[NSPipeパイプ](所有されていない)を使用して作成されるべきであり、出力は[PROCのsetStandardOutput:出力]と標準出力として設定されるべきである
しかし、あなたは、あなたがアロケーション、新しいまたはコピーしなかったデータを解放しているので、あなたがクラッシュしている理由があります。 href="http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html" rel="nofollow noreferrer">メモリ管理規則を
また、このコードの素敵なきれいな実施のためのNSTask