Frage

Hallo, ich habe den folgenden Code:

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

Der Codes -Zweck ist ein bisschen kompliziert, er verwendet Otool, um eine Liste der von einem Binär verwendeten gemeinsam genutzten Bibliotheken zu erhalten, und dann verwendet SED und awk, um sie in ein maschinenlesbares Format zu filtern. Nur um zu testen, habe ich den Mac OS X textedit.Apps binär verwendet.

Das Problem ist, dass der Code eine Ausgabe ausgeführt und zurückgibt, aber dann die App einfriert. Ich ging durch die Linie durch die Linie und fand diese Zeile das Problem:

data = [[AusgabedatehandleForReading] ReadDatatoendoffile];

Diese Zeile selbst protokolliert die Ausgabe an der Konsole und friert dann die App. Ich habe dies überprüft, indem ich alle anderen Zeilen nach dieser Zeile gelöscht habe, und es protokolliert immer noch die Ausgabe und friert ein. Es gibt nichts in Debugger und irgendwelche Vorschläge zur Lösung dieses Problems würden sehr geschätzt.

War es hilfreich?

Lösung 2

Die Lösung für dieses Problem war einfach,

Es ist ein bekannter Fehler, der nach der Ausführung von Nstasking nicht die gesamte Protokollierung funktioniert. Es gibt eine Ausgabe zurück, es protokolliert es einfach nicht. Die Lösung bestand darin, diese Zeile hinzuzufügen:

[task setStandardInput:[NSPipe pipe]];

Und alles funktioniert gut :)

Andere Tipps

Es sieht so aus, als würden Sie eine vermissen

[proc setStandardOutput:output];

Sie haben am Ende der letzten SED -Aussage einen zusätzlichen Schrägstrich. Sobald Sie es entfernen, funktioniert das Skript gut.

Die Ausgabe sollte mit [Nspipe Pipe] (nicht begegnet) erstellt werden und dann als Standardausgang mit [Proc SetStandardOutput: Ausgabe] eingestellt werden.

Der Grund, warum Sie abstürzen, ist jedoch, dass Sie Daten freigeben, die Sie nicht zu Alloc, neu oder kopiert haben. Siehe das Speicherverwaltungsregeln.

Siehe auch Quickies für Nstask Für eine schöne saubere Implementierung dieses Code.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top