J'ai couru dans un moment en essayant de lancer un NSTask
depuis l'intérieur d'un NSOperation
.Pourquoi un NSTask auto-libéré bloque-t-il indéfiniment la boucle de lancement sur un thread NSOperation?
Voici un very simple app que j'ai mis ensemble pour mettre en évidence le problème. Lorsque vous cliquez sur le bouton, un NSOperation
est mis en file d'attente. Il configure un NSRunLoop
et appelle une méthode qui appelle un NSTask
. La tâche est vraiment simple - il lance simplement /bin/sleep
pendant deux secondes (assez pour voir facilement le spinner quand les choses fonctionnent correctement). L'application fonctionne comme annoncé, cependant si vous changez la ligne 23 de TaskPerformer.m à autorelease
, (désolé, je suis un nouvel afficheur donc je ne peux pas lier directement) ou le commenter complètement (fuyant ainsi le Objet NSTask
), le thread NSOperation
ne sera jamais quitter. Son runloop principal semble bloquer quelque chose.
Maintenant, le problème est double. Tout d'abord, je ne comprends pas pourquoi mon thread bloque, mais de plus, si j'active le garbage collection pour cette application, le même comportement se manifeste. Parce qu'il n'y a aucun moyen pour moi de libérer manuellement le NSTask
, le thread se bloque quoi qu'il arrive.
Si quelqu'un pouvait me dire ce qui se passait, je serais éternellement reconnaissant!
Merci d'avoir signalé cela, Brian. Je l'avais déjà vu, je n'avais pas poussé le code mis à jour vers Github.Fixé maintenant Malheureusement, un 'NSRunLoop' est nécessaire dans mon application actuelle, car en plus de lancer un tas de' NSTask', j'utilise aussi des 'NSURLConnection' asynchrones qui nécessitent un' NSRunLoop' pour leurs rappels. Ce qui est également intéressant, c'est que la suppression de l'appel de 'waitUntilExit' fait en sorte que le thread se termine la première fois, mais pas les fois suivantes. Quelque chose me semble vraiment bizarre. – texel