94 votes

Est ARC support files d’attente de l’envoi ?

Je suis en train de lire la documentation d'apple au sujet de "Gestion de la Mémoire pour l'Expédition des Files d'attente":

Même si vous implémentez un garbage collector de l'application, vous devez toujours conserver et de libérer votre expédition des files d'attente et les autres objets de l'expédition. Grand Central Dispatch ne prend pas en charge la collecte des ordures modèle pour récupérer de la mémoire.

Je sais que l'ARC n'est pas un garbage collector, mais j'aimerais être sûr que je n'ai pas besoin de dispatch_retain et dispatch_release mon dispatch_queue_t

233voto

rob mayoff Points 124153

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, assignou 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.

23voto

kcharwood Points 1667

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X