2010-11-10 6 views
73

Normalement, si vous générez un thread d'arrière-plan ou exécutez un NSOperation sur une NSOperationQueue, vous devez créer un NSAutoreleasePool pour ce thread ou cette opération, car il n'existe pas par défaut.Avez-vous besoin de créer un NSAutoreleasePool dans un bloc dans GCD?

La même règle s'applique-t-elle à un bloc placé dans une file d'attente Grand Central Dispatch et qui sera exécuté sur un thread non principal? Autrement dit, avez-vous besoin de créer un NSAutoreleasePool dans chaque bloc que vous envoyez à autre chose que la file d'attente principale?

Dans mes tests limités, je ne vois pas les avertissements de la console pour les objets auto-libérés que vous voyez normalement avec les threads d'arrière-plan ou NSOperations. Cependant, je n'arrive pas à trouver de documentation définitive à ce sujet, alors je me demandais si quelqu'un pouvait indiquer où cela est indiqué.

+0

De la réponse publié par @Gustavo Ambrozio qui a été supprimée, la [documentation est ici] (http://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues. html # // apple_ref/doc/uid/TP40008091-CH102-SW17), au cas où les spectateurs seraient intéressés. – iDev

Répondre

107

Est-ce que la même règle à appliquer un bloc qui est placé dans une file d'attente Grand Central Dispatch et sera exécuté sur un fil non principal? En d'autres termes, avez-vous besoin de pour créer un NSAutoreleasePool au sein de chaque bloc que vous envoyez à autre que la file d'attente principale?

La répartition centrale principale gère automatiquement un pool de libération automatique par file d'attente. Cependant, il n'y a aucune garantie quant à quand la piscine sera drainée; il peut être après qu'un bloc est traité, il peut être après des centaines (mais ne sera probablement pas). Par conséquent, si vous n'allouez que quelques objets, ne vous inquiétez pas. Cependant, si vous allouez un nombre significatif d'objets (et puisque vous ciblez un environnement contraint en mémoire), vous devriez créer et drainer des pools.


La documentation a été mise à jour.

Voir https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW1

Si votre bloc crée plus de quelques objets Objective-C, vous pourriez vouloir joindre les parties du code de votre bloc dans un bloc @autorelease à gérer la gestion de la mémoire pour les objets. Bien que les files d'attente GCD aient leurs propres pools de libération automatique, elles ne garantissent pas lorsque ces pools sont vidés. Si votre application est limitée par la mémoire , la création de votre propre pool de libération automatique vous permet de libérer la mémoire pour les objets autoreleased à intervalles plus réguliers.

+3

+1 est-ce quelque chose dans la documentation? –

+6

Pas assez clairement. Bogue de documentation déposé (). – bbum

+3

Excellent. Merci pour la clarification. –