web-dev-qa-db-fra.com

ARC prend-il en charge les files d'attente de répartition?

Je lis la documentation d'Apple sur "Gestion de la mémoire pour les files d'attente de répartition":

Même si vous implémentez une application récupérée, vous devez toujours conserver et libérer vos files d'attente de répartition et autres objets de répartition. Grand Central Dispatch ne prend pas en charge le modèle de récupération de place pour récupérer la mémoire.

Je sais que ARC n'est pas un ramasse-miettes mais je voudrais être sûr que je n'ai pas besoin de dispatch_retain et dispatch_release mon dispatch_queue_t

93
flagg19

La réponse courte: OUI, ARC conserve et libère les files d'attente de répartition.







Et maintenant pour la longue réponse…

Si votre cible de déploiement est inférieure à iOS 6.0 ou Mac OS X 10.8

Vous devez utiliser dispatch_retain et dispatch_release dans votre file d'attente. 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_retain ou dispatch_release si 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 un dispatch_queue_t) est également un objet Objective-C. Ceci est documenté dans le <os/object.h> En tête de fichier:

 * 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 l'un des strong, weak, unsafe_unretained, assign ou retain attributs. 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.

Donc si votre cible de déploiement est au moins iOS 6. ou Mac OS X 10.8, et vous avez activé ARC, ARC conservera et libérera votre file d'attente, et le compilateur signalera tout essayez d'utiliser dispatch_retain ou dispatch_release comme une erreur.

Si votre cible de déploiement est au moins iOS 6. ou Mac OS X 10.8, et vous avez désactivé ARC, vous devez conserver et libérer manuellement votre file d'attente, soit en appelant dispatch_retain et dispatch_release, ou en envoyant la file d'attente retain et release messages (comme [queue retain] et [queue release]).

Pour 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_OBJC à 0. Par exemple, vous pouvez mettre ceci dans votre .pch fichier (avant tout #import instructions):

#define OS_OBJECT_USE_OBJC 0

ou vous pouvez ajouter OS_OBJECT_USE_OBJC=0 comme macro de préprocesseur dans vos paramètres de génération. Si vous définissez OS_OBJECT_USE_OBJC à 0, ARC pas conservera ou libérera votre file d'attente pour vous, et vous devrez le faire vous-même en utilisant dispatch_retain et dispatch_release.

232
rob mayoff

Juste un suivi ici ... Si votre objectif de déploiement minimum est iOS 6, ARC les gère désormais.

23
kcharwood