¿Necesita crear un NSAutoreleasePool dentro de un bloque en GCD?

Normalmente, si genera un hilo de fondo o ejecuta un NSOperation en un NSOperationQueue necesita crear un NSAutoreleasepool para ese hilo o operación porque ninguno existe por defecto.

¿La misma regla se aplica a un bloque que se coloca dentro de una cola de Grand Central Dispatch y se ejecutará en un hilo no principal? Es decir, ¿necesita crear un NSAutoreleasePool dentro de cada bloque que envíe a otra cosa que no sea la cola principal?

En mis pruebas limitadas, no veo las advertencias de la consola para objetos liberados automáticamente que normalmente se ven con hilos de fondo o NSOperations. Sin embargo, parece que no puedo encontrar documentación definitiva sobre esto, así que me preguntaba si alguien podría señalar dónde se menciona esto.

¿La misma regla se aplica a un bloque que se coloca dentro de una cola de Grand Central Dispatch y se ejecutará en un hilo no principal? Es decir, ¿necesita crear un NSAutoreleasePool dentro de cada bloque que envíe a otra cosa que no sea la cola principal?

El despacho de Grand Central administrará un grupo de autorrelease por cola automáticamente. Sin embargo, no hay garantías de cuándo se vaciará la piscina; puede ser después de que se procesa un bloque, puede ser después de cientos (pero probablemente no lo será).

Entonces, si solo está asignando algunos objetos, no se preocupe. Sin embargo, si está asignando una cantidad significativa de objetos (y dado que se dirige a un entorno restringido de memoria), entonces debería crear y drenar agrupaciones.


La documentación ha sido actualizada.

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

Si su bloque crea más de unos pocos objetos Objective-C, puede incluir partes del código de su bloque en un bloque @autorelease para manejar la administración de memoria de esos objetos. Aunque las colas de distribución de GCD tienen sus propios grupos de liberación automática, no ofrecen garantías en cuanto a cuándo se agotan esas agrupaciones. Si su aplicación tiene limitaciones de memoria, crear su propio grupo de autorrelease le permite liberar memoria para objetos liberados automáticamente a intervalos más regulares.