Pregunta

Hola tengo el siguiente código:

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

El propósito códigos es un poco complicado, se utiliza otool para obtener una lista de las bibliotecas compartidas utilizadas por un binario entonces se utiliza sed y awk para filtrar en un formato legible por máquina. Sólo para probar que he usado binario Mac OS X de TextEdit.app.

El problema es que el código se ejecuta y devuelve una salida, pero luego se congela la aplicación. Fui a través de la línea por línea y encontré esta línea para ser el problema:

datos = [[salida fileHandleForReading] readDataToEndOfFile];

Esta línea misma está registrando la salida a la consola y luego congelar la aplicación. Comprobé esta eliminando todas las demás líneas después de esa línea, y todavía se registra la salida y se congela. No hay nada en depurador y cualquier sugerencia sobre cómo resolver este problema sería muy apreciada.

¿Fue útil?

Solución 2

La solución a este problema era simple,

Es un error conocido que después se ejecuta NSTask todo el registro no funciona. Se está volviendo una salida, es simplemente no registrarlo. La solución fue añadir esta línea:

[task setStandardInput:[NSPipe pipe]];

Y todo funciona bien:)

Otros consejos

Parece que se está perdiendo a

[proc setStandardOutput:output];

Tiene una barra extra al final de la última declaración de sed. Una vez que lo quite, el script funciona bien.

salida debe ser creado con [tubería NSPipe] (sin propietario) y luego salida debe establecerse como la salida estándar con [setStandardOutput proc: salida]

Pero la razón por la que están cayendo es porque se está liberando de datos que usted no lo hizo alloc, nueva o copiar. Vea la href="http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html" rel="nofollow .

Además, vea los rápidos para NSTask para una buena aplicación de este código limpio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top