¿Por qué ARC se queja de dispatch_queue_create y dispatch_release en iOS 6?

Declaré una propiedad para hacer reference a una queue GCD:

@property (assign) dispatch_queue_t backgroundQueue; 

En el método init de una class, creo una queue en serie:

 backgroundQueue = dispatch_queue_create("com.company.app", DISPATCH_QUEUE_SERIAL); 

ARC se queja: "Asignación de object retenido a variable no segura_insegurada; el object se liberará después de la asignación"

¿Debo usar __bridge_transfer?

En -dealloc estoy liberando la queue:

 dispatch_release(backgroundQueue); 

Una vez más, ARC se queja: "ARC prohíbe el envío explícito de posts de 'liberación'"

¡Encuentro esto confuso porque esta es una llamada de function C y las queues de pensamiento son objects C por los cuales yo mismo debo ocuparme de la gestión de la memory! ¿Desde cuándo ARC maneja los objects C para mí?

En iOS 6 puede cmd + hacer clic en dispatch_queue_t y ver esto:

 /* * By default, dispatch objects are declanetworking 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 less que la queue esté referenceda en otro lugar y realmente desee una reference débil).

Antes de iOS 6, usted mismo debe administrar la memory utilizando dispatch_retain y dispatch_release. Hacer esto en iOS 6 arrojará un error de compilation.

Este post de error aparecerá si está utilizando iOS 6 SDK.

En el iOS 6.0 SDK y el iOS 6.0 SDK Mac OS X 10.8 SDK , todos los objects de envío también son parte del objective C. Para que no se preocupe por la memory, ARC administrará la memory de dispatch_queue .

Consulte el enlace para más detalles.

No debe insistir en usar assign . Puedes usar:

 @property (nonatomic) dispatch_queue_t backgroundQueue; 

o incluso

 @property dispatch_queue_t backgroundQueue; 

sin advertencia

Las funciones mágicas dispatch_retain y dispatch_release se definen en function de muchas condiciones.

En pocas palabras en mis testings: si se implementa para sdk 5, utilícelas y todo está bien, si despliega para sdk> = 6, ni siquiera piense en ellas, solo trate todo como object

Puede ver una mejor explicación aquí: https://stackoverflow.com/questions/8618632/does-arc-support-dispatch-queues?rq=1

    Intereting Posts