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.
dispatch_releaseyNULLel objeto en sudealloccódigo 5.1 . De lo contrario, algo (¿código generado por el compilador? ¿El tiempo de ejecución en sí?) Intentará liberar el objeto por segunda vez.Solo un seguimiento aquí ... Si su objetivo de implementación mínimo es iOS 6, ARC ahora los administra.
fuente