1

こんにちは私は次のコードを持っています:

- (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];

この行自体は、出力をコンソールに記録してからアプリをフリーズしています。その行の後の他のすべての行を削除してこれを確認しましたが、それでも出力がログに記録されてフリーズします。デバッガーには何もありません。この問題を解決する方法についての提案をいただければ幸いです。

4

4 に答える 4

2

あなたが行方不明になっているようです

[proc setStandardOutput:output];
于 2009-08-09T00:43:43.873 に答える
1

この問題の解決策は簡単でした、

NSTaskの実行後、すべてのロギングが機能しないという既知のバグ。それは出力を返していますが、それをログに記録していません。解決策は、次の行を追加することでした。

[task setStandardInput:[NSPipe pipe]];

そして、すべてが正常に動作します:)

于 2009-08-17T18:33:57.390 に答える
0

最後のsedステートメントの最後に余分なスラッシュがあります。削除すると、スクリプトは正常に機能します。

于 2009-08-09T02:24:03.240 に答える
0

出力は[NSPipeパイプ](所有されていない)で作成し、出力は[proc setStandardOutput:output]で標準出力として設定する必要があります

ただし、クラッシュする理由は、割り当て、新規、またはコピーしていないデータをリリースしているためです。メモリ管理ルールを参照してください。

また、このコードのすてきなクリーンな実装については、NSTaskのQuickiesを参照してください。

于 2009-08-09T10:41:36.270 に答える