J'essaie de résoudre un nsnetservice (nommé "my_mac") à une adresse IP dans une application d'arrière-plan avec ce code: et dans la même classe, j'ai ces méthodes de délégués Défini: P> - (void)netServiceDidResolveAddress:(NSNetService *)sender
- (void)netService:(NSNetService *)sender didNotResolve:(NSDictionary *)errorDict
3 Réponses :
Je ne suis pas sûr, mais on dirait que la demande n'est pas réellement programmée dans une boucle d'exécution pour une raison quelconque. Peut-être essayez peut-être quelque chose comme Ceci pour la planifier? question stupide, mais explicitez-vous explicitement Nsservicedelegate protocole ou simplement les méthodes? p> EDIT: J'avais une autre pensée que cela pourrait être une sorte de condition de race (un scénario plus probable). Les délégués sont généralement des références faibles. Si votre objet tombe hors de portée et que vous étiez autorisé, le système se retrouverait avec une poignée NIL et tire les messages à NIL. Dans le cas où vous montrez un Nsalert (ou effectuez d'autres travaux), votre objet peut être suspendu autour de lui suffisamment longtemps pour que les messages soient renvoyés. Pourriez-vous confirmer que votre objet reste autour de 8 secondes? P> P>
Merci pour la réponse SLF. J'ai essayé le code Nsrunloop que vous avez eu, mais pas de dés. J'ai juste les méthodes depuis que je cible 10,5 qui ne dispose pas du protocole formel NsserviceEgate défini.
SLF: Vous avez raison - j'ai éteint GC pour vous assurer que l'objet était toujours là et les délégués ont été appelés. Maintenant, je dois juste suivre là où il est d'être autorisé, car j'ai explicitement essayé de le retenir, et cela n'a pas fonctionné. Merci de me pointer dans la bonne direction!
La solution à des problèmes apparemment complexes est généralement plus simple que vous pensez d'abord :)
Un retenu explicite de l'objet Nsnetservice code> après
ResolvewithTimeout code> corrige le même problème pour moi aussi. Je suis nouveau dans le développement de l'iPhone, mais putain! Des choses comme celles-ci sont irritantes. Je suppose que la devise de la programmation Mac / iPhone devrait être "Cela ne fonctionne tout simplement pas".
Je ne faisais que créer un objet ServiceBrowser dans ViewDidLoad sans y avoir une référence dans le contrôleur en tant que propriété! Donc, cela a amené l'objet abandonné et libéré après la portée de la méthode.
Si vous utilisez Arc, vous devez conserver l'objet de service quelque part. Dans votre exemple, l'objet de service est probablement hors de portée et n'est pas référencé nulle part ailleurs dans votre code. Le compilateur tentera donc de le relâcher immédiatement après l'appel de la résolution.
Ajouter une propriété: P>
for (NSNetService* service in self.services) { [service stop]; } [self.services removeAllObjects];
Conserver cela fonctionne. Mais le paramètre NsNetService ne signifie-t-il pas les signatures de méthode NsnetserviceDélégate conserver l'objet? par exemple. expéditeur b> dans - (vide) NetServiceDresolveaddress: (Nsnetservice *) Sender Code>
Je viens de courir dans ce problème et j'avais déjà conservé l'objet Le fait que c'était parce que les niveaux d'accès des méthodes de délégation que j'ai définis ne correspondaient pas au niveau d'accès de la classe code> (la classe nsnetservice code> de sorte que ce n'était pas la raison. p>
code> était
public code> pendant que les méthodes de délégation étaient
internes code>). Et comme toutes les méthodes de délégation sont facultatives, le compilateur donnait simplement un avertissement silencieux. p>