73 votes

Avez-vous besoin de créer une NSAutoreleasePool au sein d’un bloc dans le GCD ?

Normalement, si vous frayer un thread d'arrière-plan ou d'exécuter une NSOperation sur un NSOperationQueue vous avez besoin pour créer un NSAutoreleasePool pour que le thread ou de fonctionnement car il n'en existe pas par défaut.

La même règle s'applique à un bloc qui est placé à l'intérieur d'un Grand Central Dispatch de la file d'attente et sera exécuté sur un non-thread principal? C'est, avez-vous besoin de créer un NSAutoreleasePool à l'intérieur de chaque bloc vous envoi à rien d'autre que la file d'attente principale?

Dans mon test limitée, je ne vois pas la console avertissements pour autoreleased les objets que vous voyez normalement avec les threads d'arrière-plan ou NSOperations. Cependant, je n'arrive pas à trouver de la documentation définitive sur cette question, alors je me demandais si quelqu'un pouvait point où c'est indiqué.

109voto

bbum Points 124887

La même règle s'applique à un bloc qui est placé à l'intérieur d'un Grand Central L'expédition de la file d'attente et sera exécuté sur un non-thread principal? C'est, avez-vous besoin d' pour créer un NSAutoreleasePool dans chaque bloc vous envoi à rien autre que le principal de la file d'attente?

Grand central dispatch aurez à gérer un autorelease pool par la file d'attente automatiquement. Cependant, il n'existe aucune garantie que lorsque la piscine sera drainé; il peut être après un bloc est traitée, elle peut être après des centaines (mais ne sera probablement pas).

Donc, si vous êtes seulement de l'allocation de quelques objets, ne vous inquiétez pas à ce sujet. Toutefois, si vous êtes affectation d'un nombre important d'objets (et puisque vous ciblez un environnement de contrainte de mémoire), alors vous devriez être en train de créer et de vidange des piscines.


La documentation a été mise à jour.

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

Si votre bloc crée plus de quelques Objective-C des objets, vous pouvez voulez joindre des pièces de votre bloc de code dans un @autorelease bloc gérer la gestion de la mémoire pour ces objets. Bien que PGCD expédition les files d'attente ont leur propre autorelease piscines, ils ne font aucune garantie quant à lorsque ces piscines sont drainés. Si votre demande est de la mémoire contraint, la création de votre propre autorelease pool vous permet de libérer de la mémoire pour autoreleased objets à des intervalles plus réguliers.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X