¿Por qué ARC se queja de dispatch_queue_create y dispatch_release en iOS 6?
memory-management automatic-ref-counting (4)
Declaré una propiedad para hacer referencia a una cola GCD:
@property (assign) dispatch_queue_t backgroundQueue;
En el método init de una clase creo una cola serial:
backgroundQueue = dispatch_queue_create("com.company.app", DISPATCH_QUEUE_SERIAL);
ARC se queja: "Al asignar un objeto retenido a una variable unsafe_unretained; el objeto se liberará después de la asignación"
¿Debo usar __bridge_transfer?
En -dealloc estoy liberando la cola:
dispatch_release(backgroundQueue);
Nuevamente, ARC se queja: "ARC prohíbe el envío explícito de mensajes de ''liberación''"
Encuentro esto confuso porque es una llamada a la función C y las colas de pensamiento son objetos C para los que debo encargarme de la administración de la memoria. ¿Desde cuándo ARC maneja los objetos C por mí?
En iOS 6 puedes cmd + click dispatch_queue_t y ver esto:
/*
* By default, dispatch 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.
* See <os/object.h> for details.
*/
Así que simplemente use fuerte en la propiedad (a menos que la cola se haga referencia en otro lugar y realmente quiera una referencia débil).
Antes de iOS 6, debe realizar la administración de la memoria mediante dispatch_retain y dispatch_release. Hacer esto en iOS 6 producirá un error de compilación.
Este mensaje de error aparecerá si está utilizando iOS 6 SDK.
En el iOS 6.0 SDK
y en el iOS 6.0 SDK
Mac OS X 10.8 SDK
, cada objeto de envío también forma parte del objetivo C. Por lo tanto, no debe preocuparse por la memoria, ARC administrará la memoria de dispatch_queue
.
Por favor, consulte el link para más detalles.
Las funciones magic dispatch_retain
y dispatch_release
se definen en base a muchas condiciones.
En mis pruebas: si implementa para sdk 5, úselos y todo está bien. Si implementa para sdk> = 6, ni siquiera piense en ellos, simplemente trate todo como un objeto.
Puede ver una mejor explicación aquí: https://.com/questions/8618632/does-arc-support-dispatch-queues?rq=1
Usted no debe insistir en utilizar assign
. Puedes usar:
@property (nonatomic) dispatch_queue_t backgroundQueue;
o incluso
@property dispatch_queue_t backgroundQueue;
sin previo aviso.