La réponse courte: OUI, ARC conserve et libère les files d'attente de distribution.
Et maintenant pour la réponse longue…
Si votre cible de déploiement est inférieure à iOS 6.0 ou Mac OS X 10.8
Vous devez utiliser dispatch_retainet dispatch_releasesur votre file d'attente. L'ARC ne les gère pas.
Si votre cible de déploiement est iOS 6.0 ou Mac OS X 10.8 ou version ultérieure
ARC gérera votre file d'attente pour vous. Vous n'avez pas besoin (et ne pouvez pas) utiliser dispatch_retainou dispatch_releasesi ARC est activé.
Détails
À partir du SDK iOS 6.0 et du SDK Mac OS X 10.8, chaque objet de répartition (y compris a dispatch_queue_t) est également un objet Objective-C. Ceci est documenté dans le <os/object.h>fichier d' en- tête:
* 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.
Cela signifie que vous pouvez stocker votre file d' attente dans un NSArrayou NSDictionary, ou dans une propriété avec l' un des strong, weak, unsafe_unretained, assignou retainattributs. Cela signifie également que si vous faites référence à votre file d'attente à partir d'un bloc, le bloc conservera automatiquement la file d'attente.
Ainsi, si votre cible de déploiement est au moins iOS 6.0 ou Mac OS X 10.8 et que ARC est activé , ARC conservera et libèrera votre file d'attente, et le compilateur signalera toute tentative d'utilisation dispatch_retainou dispatch_releasecomme une erreur.
Si votre cible de déploiement est au moins iOS 6.0 ou Mac OS X 10.8 et que ARC est désactivé , vous devez conserver et libérer manuellement votre file d'attente, soit en appelant dispatch_retainet dispatch_release, soit en envoyant la file d'attente retainet les releasemessages (comme [queue retain]et [queue release]).
Pour assurer la compatibilité avec les anciennes bases de code, vous pouvez empêcher le compilateur de voir votre file d'attente comme un objet Objective-C en définissant OS_OBJECT_USE_OBJCto 0. Par exemple, vous pouvez mettre ceci dans votre .pchfichier (avant toute #importinstruction):
#define OS_OBJECT_USE_OBJC 0
ou vous pouvez ajouter OS_OBJECT_USE_OBJC=0comme macro de préprocesseur dans vos paramètres de construction. Si vous définissez OS_OBJECT_USE_OBJCsur 0, ARC ne conservera ni ne libérera votre file d'attente pour vous, et vous devrez le faire vous-même en utilisant dispatch_retainet dispatch_release.