Comment mettre en place un pool autorelease lors de l'utilisation de

Salut je suis en utilisant [NSThread detachNewThreadSelector: toTarget: withObject:] et je reçois beaucoup de memory leaks parce que je n'ai pas de pool autorelease mis en place pour le thread détaché. Je me request juste où je fais ceci? Est-ce avant que j'appelle

[NSThread detachNewThreadSelector:toTarget:withObject:] 

ou dans la méthode qui est en cours d'exécution dans l'autre thread?

Toute aide serait appréciée, un exemple de code serait génial.

Merci.

dans la méthode que vous appelez avec le fil … c'est à dire donné cela …

 [NSThread detachNewThreadSelector:@selector(doStuff) toTarget:self withObject:nil]; 

Votre méthode serait …

 - (void)doStuff { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; //Do stuff [pool release]; } 

Vous devez configurer un pool autorelease dans la méthode que vous appelez et qui sera exécuté dans le nouveau thread détaché.

Par exemple:

 // Create a new thread, to execute the method myMethod [NSThread detachNewThreadSelector:@selector(myMethod) toTarget:self withObject:nil]; 

et

 - (void) myMethod { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // Here, add your own code // ... [pool drain]; } 

Notez que nous utilisons drain et ne pas libérer sur le autoreleasepool. Sur iOS, il n'y a pas de différence. Sur Mac OS X, si votre application est collectée, elle triggersra la récupération de place. Cela vous permet d'écrire du code que vous pouvez réutiliser plus facilement.

Créez le nouveau fil:

 [NSThread detachNewThreadSelector:@selector(myMethod) toTarget:self withObject:nil]; 

Créez la méthode appelée par le nouveau thread.

 - (void)myMethod { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // Your Code [pool release]; } 

Que faire si vous avez besoin de faire quelque chose dans le thread principal à l'intérieur de votre nouveau thread (par exemple, afficher un symbole de chargement)? Utilisez performSelectorOnMainThread.

 [self performSelectorOnMainThread:@selector(myMethod) withObject:nil waitUntilDone:false]; 

Reportez-vous à: – Exemples de SDK iPhone

Faites-le dans la méthode que vous appelez. Essentiellement, vous devez configurer la méthode appelée comme une unité de travail autonome (en fait, elle sera compatible avec l'appel de [NSOperation][1] ou de Grand Central Dispatch , aussi bien: les deux façons d'organiser travail simultané).

Mais que faire si je ne peux pas changer l'implémentation de la méthode que j'appelle sur un nouveau thread?

Dans ce cas, vous feriez ceci:

 [NSThread detachNewThreadSelector: @selector(blah:) toTarget: obj withObject: arg] 

pour faire ceci:

 [NSThread detachNewThreadSelector: @selector(invokeBlah:) toTarget: self withObject: dict] - (void)invokeBlah: (id)dict { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; id obj = [dict objectForKey: @"target"]; id arg = [dict objectForKey: @"argument"]; [obj blah: arg]; [pool release]; } 

Au lieu d'utiliser le dictionary, vous pouvez également créer un NSInvocation qui encapsule l'appel d'object distant. Je viens de choisir un dictionary parce que c'est le moyen le plus rapide de montrer la situation dans une réponse SO. L'un ou l'autre travaillerait.

La documentation indique que la méthode exécutée dans le thread doit créer et détruire son propre pool de libération automatique. Donc, si votre code a

 [NSThread detachNewThreadSelector:@selector(doThings) toTarget:self withObject:nil]; 

La méthode devrait être

 - (void)doThings { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; //Do your things here [pool release]; }