O ARC suporta filas de despacho?

Estou lendo a documentação da apple sobre “memory management para filas de distribuição”:

Mesmo se você implementar um aplicativo de garbage collection, ainda deverá reter e liberar suas filas de distribuição e outros objects de expedição. O Grand Central Dispatch não suporta o modelo de garbage collection para recuperar memory.

Eu sei que o ARC não é um coletor de lixo, mas eu gostaria de ter certeza de que eu não preciso despachar_retir e despachar_release meu dispatch_queue_t

A resposta curta: YES, ARC retém e libera as filas de despacho.

E agora para a resposta longa …

Se o seu destino de implementação for menor que o iOS 6.0 ou o Mac OS X 10.8

Você precisa usar dispatch_retain e dispatch_release em sua fila. O ARC não os gerencia.

Se o seu destino de implementação for o iOS 6.0 ou o Mac OS X 10.8 ou posterior

ARC irá gerenciar sua fila para você. Você não precisa (e não pode) usar dispatch_retain ou dispatch_release se o ARC estiver habilitado.

Detalhes

A partir do SDK do iOS 6.0 e do SDK do Mac OS X 10.8, cada object de expedição (incluindo um dispatch_queue_t ) também é um object Objective-C. Isso está documentado no arquivo de header :

  * 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 (eg 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. 

Isso significa que você pode armazenar sua fila em um NSArray ou NSDictionary , ou em uma propriedade com um dos atributos strong , weak , unsafe_unretained , assign ou retain . Isso também significa que, se você se referir à sua fila de um bloco, o bloqueio manterá a fila automaticamente.

Portanto, se seu destino de implementação for pelo menos iOS 6.0 ou Mac OS X 10.8 e você tiver o ARC habilitado , o ARC reterá e liberará sua fila, e o compilador sinalizará qualquer tentativa de usar dispatch_retain ou dispatch_release como um erro.

Se seu destino de implementação for pelo menos iOS 6.0 ou Mac OS X 10.8 e você tiver o ARC desativado , deverá manter e liberar manualmente sua fila, chamando dispatch_retain e dispatch_release ou enviando a fila retain e release mensagens (como [queue retain] e [queue release] ).

Para compatibilidade com bases de código antigas, você pode impedir que o compilador veja sua fila como um object Objective-C definindo OS_OBJECT_USE_OBJC como 0 . Por exemplo, você pode colocar isso no seu arquivo .pch (antes de qualquer declaração #import ):

 #define OS_OBJECT_USE_OBJC 0 

ou você pode adicionar OS_OBJECT_USE_OBJC=0 como uma macro de pré-processamento em suas configurações de compilation. Se você definir OS_OBJECT_USE_OBJC para 0 , o ARC não reterá ou liberará sua fila para você, e você terá que fazer isso sozinho usando dispatch_retain e dispatch_release .

Apenas um acompanhamento aqui … Se seu destino de implantação mínimo for o iOS 6, o ARC agora os gerencia.