Salut, j'ai le code suivant: il utilise otool pour obtenir une liste des bibliothèques partagées utilisées par un binaire alors il utiliseEn utilisant NSTask: congélation app après son retour de sortie
- (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é, sed et awk pour le filtrer dans un format lisible par machine. Juste pour tester j'ai utilisé le binaire de Mac OS X TextEdit.app.
Le problème est que le code s'exécute et renvoie une sortie, mais fige l'application. Je l'ai parcouru ligne par ligne et j'ai trouvé que cette ligne était le problème:
data = [[output fileHandleForReading] readDataToEndOfFile];
Cette ligne enregistre elle-même la sortie sur la console, puis bloque l'application. J'ai vérifié cela 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 toute suggestion sur la façon de résoudre ce problème serait grandement appréciée.
J'ai copié le code dans un outil de ligne de commande, a ajouté le manque 'setStandardOutput:' message, et il a couru. Cela fonctionne bien, sauf que vous sur-relâchez 'data' à la fin. –
"J'ai vérifié cela en supprimant toutes les autres lignes après cette ligne ..." Je suggère d'échantillonner votre application à la place. Voir l'homme 1 échantillon. –