ios memory-management automatic-ref-counting grand-central-dispatch

¿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.