¿ARC admite colas de despacho?

Estoy leyendo la documentación de Apple sobre “Administración de memoria para las colas de envío”:

Incluso si implementa una aplicación recolectada basura, aún debe conservar y liberar sus colas de envío y otros objetos de despacho. Grand Central Dispatch no es compatible con el modelo de recolección de basura para reclamar memoria.

Sé que ARC no es un recolector de basura, pero me gustaría asegurarme de que no necesito despachar.recautar y despachar.release mi dispatch_queue_t

La respuesta corta: SÍ, ARC retiene y libera las colas de despacho.

Y ahora para la respuesta larga …

Si su destino de despliegue es inferior a iOS 6.0 o Mac OS X 10.8

Necesita utilizar dispatch_retain y dispatch_release en su cola. ARC no los administra.

Si su destino de despliegue es iOS 6.0 o Mac OS X 10.8 o posterior

ARC administrará su cola para usted. No necesita (y no puede) utilizar dispatch_retain o dispatch_release si ARC está habilitado.

Detalles

Comenzando en iOS 6.0 SDK y Mac OS X 10.8 SDK, cada objeto de despacho (incluido un dispatch_queue_t ) también es un objeto Objective-C. Esto está documentado en el archivo de encabezado :

  * By default, libSystem objects such as GCD and XPC objects are declared as * Objective-C types when building with an Objective-C compiler. This allows * them to participate in ARC, in RR management by the Blocks runtime and in * leaks checking by the static analyzer, and enables them to be added to Cocoa * collections. * * NOTE: this requires explicit cancellation of dispatch sources and xpc * connections whose handler blocks capture the source/connection object, * resp. ensuring that such captures do not form retain cycles (eg by * declaring the source as __weak). * * To opt-out of this default behavior, add -DOS_OBJECT_USE_OBJC=0 to your * compiler flags. * * This mode requires a platform with the modern Objective-C runtime, the * Objective-C GC compiler option to be disabled, and at least a Mac OS X 10.8 * or iOS 6.0 deployment target. 

Esto significa que puede almacenar su cola en un NSArray o NSDictionary , o en una propiedad con uno de los atributos strong , weak , unsafe_unretained , assign , o retain . También significa que si se refiere a su cola desde un bloque, el bloque retendrá la cola automáticamente.

Entonces, si su destino de despliegue es al menos iOS 6.0 o Mac OS X 10.8, y tiene ARC habilitado , ARC retendrá y liberará su cola, y el comstackdor señalará cualquier bash de utilizar dispatch_retain o dispatch_release como un error.

Si su destino de despliegue es al menos iOS 6.0 o Mac OS X 10.8, y tiene ARC deshabilitado , debe retener y liberar manualmente su cola, llamando a dispatch_retain y dispatch_release , o enviando la cola retain y release mensajes (como [queue retain] y [queue release] ).

Para compatibilidad con bases de código antiguas, puede evitar que el comstackdor vea su cola como un objeto Objective-C definiendo OS_OBJECT_USE_OBJC en 0 . Por ejemplo, puede poner esto en su archivo .pch (antes de cualquier instrucción #import ):

 #define OS_OBJECT_USE_OBJC 0 

o puede agregar OS_OBJECT_USE_OBJC=0 como macro de preprocesador en la configuración de su comstackción. Si configura OS_OBJECT_USE_OBJC en 0 , ARC no retendrá ni liberará su cola por usted, y deberá hacerlo usted mismo utilizando dispatch_retain y dispatch_release .

Solo un seguimiento aquí … Si su objective de implementación mínimo es iOS 6, ARC ahora los administra.