36

Mantengo una cola de distribución como propiedad con mi controlador de vista. Creo esta cola una vez en el método init de mi controlador de vista, y la reutilizo varias veces para algunas tareas en segundo plano. Antes de ARC, que estaba haciendo esto:¿Qué propiedad debo usar para una Cola de despacho después de ARC?

@property (nonatomic, assign) dispatch_queue_t filterMainQueue; 

Y en init:

if (filterMainQueue == nil) { 
    filterMainQueue = dispatch_queue_create("com.myQueue.CJFilterMainQueue", NULL); 
} 

Pero después de ARC, no estoy seguro de si esto todavía debe ser "asignar", o debe ser "fuerte "o" débil ". La secuencia de comandos del convertidor ARC no cambió nada, pero no estoy seguro de si un error sutil proviene del hecho de que esta cola podría ser desasignada mientras se está utilizando.

¿Cuál sería la diferencia entre los 3 tipos de propiedades y qué funcionaría mejor para una cola de envío cuando se usa ARC?

Respuesta

55

respuesta Actualizado:

En OS X y iOS actual, objetos de envío son ahora tratados como objetos Obj-C por ARC. Serán administrados por memoria de la misma manera que los objetos Obj-C, y debe usar strong para su propiedad.

Esto está controlado por la macro OS_OBJECT_USE_OBJC, definida en <os/object.h>. Se establece en 1 de forma predeterminada cuando su destino de despliegue es OS X 10.8 o superior, o iOS 6.0 o superior. Si se está implementando en un sistema operativo anterior, este se deja en 0 y debería ver mi respuesta original a continuación.


Respuesta original:

objetos de envío (incluyendo colas) no son objetos Obj-C, por lo que la única opción posible es assign. El compilador arrojará un error si intenta utilizar strong o weak. ARC no tiene impacto en GCD.

+0

@JimThio: [Grand Central Dispatch] (http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html) –

+13

Esto ya no es cierto en Mountain Lion - ver /usr/include/os/object.h. Los "objetos" GCD y XPC (cualquier cosa que puedas liberar explícitamente) ahora se comportan lo suficiente como objetos ObjC que pueden participar en ARC. – jkh

+0

@jkh ¿eso incluye también la plataforma iOS? – Ankur

4

aquí es lo que utilizo:

@property (readwrite, strong, nonatomic) __attribute__((NSObject)) dispatch_queue_t queue; 
+0

¿Por qué? ¿Puedes explicar? –

+2

Básicamente convierte un objeto no ObjC en una propiedad ObjC para que pueda usarlo fácilmente como self.queue – Arvin

+0

@Arvin Algo cambió con 6.1 que afectó esto. Se quejó de __attribute__ y eliminarlo parece funcionar ahora. No me he encontrado con ningún problema, así que supongo que la propiedad (readwrite, strong, nonatomic) dispatch_queue_t queue es segura? – TheJer

4

Basado en iOS7, I probado si dispatch_queue objeto es un objeto objetivo-C y me di cuenta de que ya son objeto objetivo-c. parafraseando esto, atributo ((NSObject)) no es necesario ahora.

1

TL; DR: dispatch_queue_t es un objeto Objective C ahora y se puede administrar con ARC.

No he probado cuánto tiempo atrás esto es cierto, pero usando el iOS 7 SDK y Xcode 5, dispatch_queue_t es un tipo de objeto. Estoy declarando una propiedad para una cola como

@property (nonatomic, strong) dispatch_queue_t syncQueue; 

El compilador es feliz y todo funciona como se esperaba. Sé definitivamente que esto no solía funcionar en iOS 4 o 5 (antes de ARC era retain en lugar de strong).Cavé en la definición de dispatch_queue_t y encontré esto:

/*! 
* @typedef dispatch_queue_t 
* 
* @abstract 
* Dispatch queues invoke blocks submitted to them serially in FIFO order. A 
* queue will only invoke one block at a time, but independent queues may each 
* invoke their blocks concurrently with respect to each other. 
* 
* @discussion 
* Dispatch queues are lightweight objects to which blocks may be submitted. 
* The system manages a pool of threads which process dispatch queues and 
* invoke blocks submitted to them. 
* 
* Conceptually a dispatch queue may have its own thread of execution, and 
* interaction between queues is highly asynchronous. 
* 
* Dispatch queues are reference counted via calls to dispatch_retain() and 
* dispatch_release(). Pending blocks submitted to a queue also hold a 
* reference to the queue until they have finished. Once all references to a 
* queue have been released, the queue will be deallocated by the system. 
*/ 
DISPATCH_DECL(dispatch_queue); 

por los sonidos de eso, no hay que trabajar, por lo que he comprobado la definición de DISPATCH_DECL y encontré esto, que lo explica todo:

/* 
* 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. 
*/ 
7

Así es como se podría definir la propiedad dispatch_queue_t para iOS 6.0 y superior y por debajo de iOS 6,0

#if OS_OBJECT_HAVE_OBJC_SUPPORT == 1 
@property (nonatomic, strong) dispatch_queue_t serialDispatchQueue; 
#else 
@property (nonatomic, assign) dispatch_queue_t serialDispatchQueue; 
#endif 

Básicamente i OS_OBJECT_HAVE_OBJC_SUPPORT s definido como 1 para iOS 6.0 y superior. (MAC 10.8 y superior). Debajo de iOS 6 se define como 0.

OS_OBJECT_HAVE_OBJC_SUPPORT define que los objetos del sistema operativo como GCD tienen soporte C objetivo. Así que ARC, gestión de memoria, recuento de referencias, etc. se aplica a los objetos GCD.

+1

Esto de alguna manera falla para las bibliotecas de CocoaPods http://stackoverflow.com/q/27267865/1049134 – Rivera

Cuestiones relacionadas