2009-09-30 8 views
0

J'ai un NSDictionary qui est passé du thread principal à un second thread qui conserve, utilise, puis libère la variable. Que se passe-t-il si le pool de libération automatique du thread principal est drainé alors que le 2ème thread utilise encore la variable? Même si j'ai conservé la variable dans le 2ème thread, le pool du thread principal va-t-il savoir qu'il est toujours utilisé?Actions spéciales de libération automatique pour une variable transmise d'un thread à un autre (iphone)

Merci.

Répondre

2

Le pool autorelease est assez bête. Il ne "sait" pas qu'une variable est utilisée. Il appelle simplement release sur chaque objet autoreleased. Cela se produit généralement à la fin de chaque itération de la boucle d'événement.

Si le pool de libération automatique est drainé avant que votre deuxième thread ait une chance de le conserver, il sera libéré. Au lieu de cela, il est généralement une bonne idée de conserver tout ce qui sera utilisé dans un autre thread avant à partir du thread. Vous n'avez aucun moyen de savoir quand le thread s'exécutera, il est donc préférable de supposer qu'il ne fonctionnera pas tant que le pool d'autorelease ne sera pas épuisé.

En d'autres termes, faire quelque chose comme ceci:

NSDictionary *dictionary = // Get the autoreleased dictionary... somehow 
[NSThread detachNewThreadSelector:@selector(myThread:) toTarget:self withObject:[dictionary retain]]; 

Gardez à l'esprit votre fil possède maintenant dictionary et est responsable d'appeler release sur avant les sorties de fil, ou bien votre application fuite de mémoire.

Questions connexes