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
Et maintenant pour la longue réponse…
Vous devez utiliser dispatch_retain
et dispatch_release
dans votre file d'attente. ARC ne les gère pas.
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é.
À 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
.
Juste un suivi ici ... Si votre objectif de déploiement minimum est iOS 6, ARC les gère désormais.