La respuesta corta: SÍ, ARC retiene y libera las colas de despacho.
Y ahora para la respuesta larga ...
Si su destino de implementación es inferior a iOS 6.0 o Mac OS X 10.8
Necesita usar dispatch_retainy dispatch_releaseen su cola. ARC no los gestiona.
Si su destino de implementación es iOS 6.0 o Mac OS X 10.8 o posterior
ARC administrará su cola por usted. No necesita (y no puede) usar dispatch_retaino dispatch_releasesi ARC está habilitado.
Detalles
A partir del SDK de iOS 6.0 y del SDK de Mac OS X 10.8, cada objeto de envío (incluido a dispatch_queue_t) también es un objeto de Objective-C. Esto está documentado en el <os/object.h>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 (e.g. 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 una NSArrayo NSDictionary, o en una propiedad con una de las strong, weak, unsafe_unretained, assign, o retainatributos. También significa que si se refiere a su cola desde un bloque, el bloque retendrá la cola automáticamente.
Entonces, si su objetivo de implementación es al menos iOS 6.0 o Mac OS X 10.8, y tiene ARC habilitado , ARC retendrá y liberará su cola, y el compilador marcará cualquier intento de uso dispatch_retaino dispatch_releasecomo un error.
Si su objetivo de implementación es al menos iOS 6.0 o Mac OS X 10.8, y tiene ARC deshabilitado , debe retener y liberar manualmente su cola, ya sea llamando dispatch_retainy dispatch_release, o enviando la cola retainy los releasemensajes (como [queue retain]y [queue release]).
Para lograr compatibilidad con bases de código antiguas, puede evitar que el compilador vea su cola como un objeto Objective-C definiendo OS_OBJECT_USE_OBJCa 0. Por ejemplo, puede poner esto en su .pcharchivo (antes de cualquier #importdeclaración):
#define OS_OBJECT_USE_OBJC 0
o puede agregar OS_OBJECT_USE_OBJC=0como una macro de preprocesador en su configuración de compilación. Si se establece OS_OBJECT_USE_OBJCque 0, ARC no retener o liberar la cola para usted, y usted tendrá que hacerlo usted mismo usando dispatch_retainy dispatch_release.