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
.
dispatch_release
yNULL
el objeto en sudealloc
có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