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_retain
y dispatch_release
en 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_retain
o dispatch_release
si 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 NSArray
o NSDictionary
, o en una propiedad con una de las strong
, weak
, unsafe_unretained
, assign
, o retain
atributos. 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_retain
o dispatch_release
como 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_retain
y dispatch_release
, o enviando la cola retain
y los release
mensajes (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_OBJC
a 0
. Por ejemplo, puede poner esto en su .pch
archivo (antes de cualquier #import
declaración):
#define OS_OBJECT_USE_OBJC 0
o puede agregar OS_OBJECT_USE_OBJC=0
como una macro de preprocesador en su configuración de compilación. Si se establece OS_OBJECT_USE_OBJC
que 0
, ARC no retener o liberar la cola para usted, y usted tendrá que hacerlo usted mismo usando dispatch_retain
y dispatch_release
.