Si votre cible de déploiement est inférieur à iOS 6.0 ou Mac OS X 10.8
Vous devez utiliser dispatch_retain
et dispatch_release
sur votre file d'attente. L'ARC ne les gérer.
Si votre cible de déploiement est iOS 6.0 ou Mac OS X 10.8 ou version ultérieure
L'ARC sera de gérer votre file d'attente pour vous. Vous ne devez pas (et ne peut) pas utiliser dispatch_retain
ou dispatch_release
si l'ARC est activé.
Détails
Départ dans le SDK iOS 6.0 et Mac OS X 10.8 SDK, chaque objet de répartition (y compris un dispatch_queue_t
) est également un Objectif-C objet. Ceci est documenté dans l' <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 NSArray
ou NSDictionary
, ou dans une propriété avec un de la strong
, weak
, unsafe_unretained
, assign
ou retain
attributs. Cela signifie également que si vous vous référez à votre file d'attente à partir d'un bloc, le bloc conservent la file d'attente automatiquement.
Donc, si votre cible de déploiement est au moins iOS 6.0 ou Mac OS X 10.8, et vous avez de l'ARC est activé, l'ARC de conserver et de remettre votre file d'attente, et le compilateur signalera toute tentative d'utilisation d' dispatch_retain
ou dispatch_release
comme une erreur.
Si votre cible de déploiement est au moins iOS 6.0 ou Mac OS X 10.8, et vous avez de l'ARC désactivé, vous devez manuellement retenir et libérer votre file d'attente, soit en appelant dispatch_retain
et dispatch_release
, ou par l'envoi de la file d'attente, retain
et release
des messages (comme [queue retain]
et [queue release]
).
Pour la compatibilité avec d'anciennes bases de code, vous pouvez empêcher le compilateur de voir votre file d'attente comme Objective-C objet en définissant OS_OBJECT_USE_OBJC
de 0
. Par exemple, vous pouvez mettre ceci dans votre .pch
le fichier (avant tout #import
des déclarations):
#define OS_OBJECT_USE_OBJC 0
ou vous pouvez ajouter l' OS_OBJECT_USE_OBJC=0
d'un pré-processeur de macro dans vos paramètres de construction. Si vous définissez OS_OBJECT_USE_OBJC
de 0
, l'ARC aura pas de conserver ou de libérer votre file d'attente pour vous, et vous devez le faire vous-même à l'aide de dispatch_retain
et dispatch_release
.