5

Tengo un método de ciclo de ejecución para un CAEAGLLayer que usa GCD para serializar el acceso a ivars compartidos.¿Es necesario crear un grupo de autorrelease bajo ARC en GCD?

Mi código de dibujo actualmente se construye así:

- (void)draw { 
    dispatch_sync(serialDrawingQueue, ^{ 
     @autoreleasepool { 
      [self drawingStart]; 

      [spriteA draw]; 
      [spriteB draw]; 

      [self drawingEnd]; 
     } 
    }); 
} 

El método draw es llamado por un CADisplayLink. ¿Es necesario el @autoreleasepool cuando uso bloques GCD?

+0

¿Qué tal si lo intenta y ve si obtiene "ninguna piscina en su lugar ... solo goteando"? ¿error de mensajes? –

+1

Obviamente, es mejor preguntar a los desarrolladores más experimentados si esta es una buena idea. –

Respuesta

21

Desde el Apple docs:

Si su bloque crea más de unos pocos objetos de Objective-C, es posible que desee incluir partes de código de su bloque en un bloque @autorelease a manejar la gestión de memoria para esos objetos. Aunque las colas de distribución de GCD tienen sus propias agrupaciones de liberación automática, no hacen garantías en cuanto a cuándo se agotan esas agrupaciones. Si su aplicación tiene memoria limitada , la creación de su propio grupo de autorelease le permite liberar la memoria para objetos liberados automáticamente a intervalos más regulares.

-1

Parece que en iOS10 o superior las colas de distribución ya no rodean bloques de forma predeterminada en @autoreleasepool. Esto se indica con las macros DISPATCH_QUEUE_SERIAL_WITH_AUTORELEASE_POOL y DISPATCH_QUEUE_CONCURRENT_WITH_AUTORELEASE_POOL definidas en queue.h

Cuestiones relacionadas