2011-03-23 1 views

Répondre

18

Vous devriez changer pour ...

dispatch_queue_t myQueue = dispatch_queue_create("com.mysite.page", 0); 
dispatch_async(myQueue, ^{}); 
dispatch_release(myQueue); 

... vous devriez appeler dispatch_release lorsque vous ne avez besoin d'un accès à la file d'attente. Et comme myQueue est variable locale, vous devez l'appeler là.

Lire la documentation dispatch_queue_create:

Discussion

Les blocs soumis à la file d'attente sont exécutées une à la fois dans l'ordre FIFO. Notez cependant que les blocs soumis à des files d'attente indépendantes peuvent être exécutés simultanément les uns par rapport aux autres.

Lorsque votre application n'a plus besoin de la file d'attente d'expédition, elle doit la libérer avec la fonction dispatch_release. Tous les blocs en attente soumis à une file d'attente contiennent une référence à cette file d'attente, de sorte que la file d'attente n'est pas libérée tant que tous les blocs en attente ne sont pas terminés.

+0

Est-ce encore vrai? Avec ARC, nous n'avons pas besoin de le libérer – hfossli

4

L'outil de fuite signale où la mémoire est allouée qui n'a plus aucune référence de votre code.

Après que cette méthode s'exécute, puisqu'il n'y a rien qui ait une référence à la file d'attente que vous avez créée, et dispatch_release() n'a jamais été appelé, il est considéré comme une fuite.

+1

Même ARC ne gère pas cela pour vous. Vous devez donc le libérer aussi: dispatch_release (myQueue) .. – geforce

Questions connexes