質問

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

- (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 の短時間セックスを参照してください。

scroll top