Question

Salut j'ai le code suivant:

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

Le but de codes est un peu compliqué, il utilise otool pour obtenir une liste des bibliothèques partagées utilisées par un binaire alors il utilise sed et awk pour filtrer dans un format lisible par machine. Juste pour tester je l'ai utilisé le binaire Mac OS X TextEdit.app.

Le problème est que le code fonctionne et retourne une sortie mais se fige alors l'application. Je suis passé par ligne par ligne et a trouvé cette ligne est le problème:

data = [[sortie fileHandleForReading] readDataToEndOfFile];

Cette ligne elle-même est la sortie de l'exploitation forestière de la console, puis geler l'application. J'ai vérifié en supprimant toutes les autres lignes après cette ligne, et il enregistre toujours la sortie et se fige. Il n'y a rien dans le débogueur et des suggestions sur la façon de résoudre ce problème serait grandement apprécié.

Était-ce utile?

La solution 2

La solution à ce problème est simple,

C'est un bug connu qu'après NSTask est exécuté toute exploitation forestière ne fonctionne pas. Il retourne une sortie, son exploitation forestière juste pas. La solution a été d'ajouter cette ligne:

[task setStandardInput:[NSPipe pipe]];

Et tout fonctionne bien:)

Autres conseils

On dirait que vous manque un

[proc setStandardOutput:output];

Vous avez une barre oblique supplémentaire à la fin de la dernière déclaration sed. Une fois que vous le retirez, le script fonctionne très bien.

sortie doit être créé avec [tuyau NSPipe] (unowned), puis la sortie doit être réglée en tant que sortie standard avec [proc setStandardOutput: sortie]

Mais la raison pour laquelle vous s'écraser est parce que vous publiez des données que vous ne l'avez pas alloc, nouvelle ou copie. Voir de .

En outre, voir Quickies pour NSTask pour une bonne mise en œuvre propre de ce code.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top