Domanda

Ciao ho il seguente codice:

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

I codici scopo è un pò complicato, utilizza otool per ottenere un elenco delle librerie condivise utilizzate da un binario allora utilizza sed e awk per filtrare in un formato leggibile dal computer. Giusto per provare che ho usato binario di Mac OS X di TextEdit.app.

Il problema è che il codice viene eseguito e restituisce un output, ma poi si blocca l'applicazione. Sono andato attraverso riga per riga e ho trovato questa linea per essere il problema:

data = [[uscita fileHandleForReading] readDataToEndOfFile];

Questa linea si sta registrando l'output alla console e poi il congelamento l'applicazione. Ho controllato questo eliminando tutte le altre righe dopo quella linea, ed i registri ancora l'uscita e si blocca. Non c'è nulla nel debugger e qualche suggerimento su come risolvere questo problema sarebbe molto apprezzato.

È stato utile?

Soluzione 2

La soluzione a questo problema è stato semplice,

E 'un noto bug che dopo NSTask viene eseguita tutta la registrazione non funziona. Si sta tornando un'uscita, la sua non solo la registrazione di esso. La soluzione era quella di aggiungere questa riga:

[task setStandardInput:[NSPipe pipe]];

E tutto funziona bene:)

Altri suggerimenti

Sembra che vi state perdendo un

[proc setStandardOutput:output];

Hai barra extra alla fine dell'ultima dichiarazione SED. Una volta che lo si rimuove, lo script funziona bene.

uscita dovrebbe essere eseguita con [tubo NSPipe] (unowned) e quindi l'uscita deve essere impostato come standard output con [proc setStandardOutput: uscita]

Ma la ragione che si sta schiantarsi è perché si stanno rilasciando i dati che voi non avete alloc, nuova o copiare. Vedere la .

Inoltre, vedere Quickies per NSTask per una bella realizzazione pulita di questo codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top