La risposta breve: SÌ, ARC conserva e rilascia le code di invio.
E ora per la lunga risposta ...
Se l'obiettivo di distribuzione è inferiore a iOS 6.0 o Mac OS X 10.8
Devi usare dispatch_retain
e dispatch_release
sulla tua coda. ARC non li gestisce.
Se la destinazione della distribuzione è iOS 6.0 o Mac OS X 10.8 o versioni successive
ARC gestirà la tua coda per te. Non è necessario (e non è possibile) utilizzare dispatch_retain
o dispatch_release
se ARC è abilitato.
Dettagli
A partire da iOS 6.0 SDK e Mac OS X 10.8 SDK, ogni oggetto di invio (incluso a dispatch_queue_t
) è anche un oggetto Objective-C. Questo è documentato nel <os/object.h>
file di intestazione:
* 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.
Questo significa che è possibile memorizzare la coda in una NSArray
o NSDictionary
, oppure in una proprietà con una delle strong
, weak
, unsafe_unretained
, assign
, o retain
attributi. Significa anche che se fai riferimento alla tua coda da un blocco, il blocco manterrà la coda automaticamente.
Quindi, se il tuo obiettivo di distribuzione è almeno iOS 6.0 o Mac OS X 10.8 e hai ARC abilitato , ARC manterrà e rilascerà la tua coda e il compilatore segnalerà qualsiasi tentativo di utilizzare dispatch_retain
o dispatch_release
come errore.
Se la destinazione di distribuzione è di almeno iOS 6.0 o Mac OS X 10.8, e si hanno ARC disattivato , è necessario trattenere e rilasciare la coda, manualmente o chiamando dispatch_retain
e dispatch_release
, o con l'invio di coda retain
e release
dei messaggi (come [queue retain]
e [queue release]
).
Per compatibilità con i vecchi codebase, puoi impedire al compilatore di vedere la tua coda come un oggetto Objective-C definendo OS_OBJECT_USE_OBJC
a 0
. Ad esempio, puoi inserire questo nel tuo .pch
file (prima di qualsiasi #import
istruzione):
#define OS_OBJECT_USE_OBJC 0
oppure puoi aggiungere OS_OBJECT_USE_OBJC=0
come macro del preprocessore nelle impostazioni di build. Se si imposta OS_OBJECT_USE_OBJC
a 0
, ARC sarà non mantenere o rilasciare la coda per voi, e si dovrà fare da soli usando dispatch_retain
e dispatch_release
.