A resposta curta: SIM, o ARC retém e libera filas de despacho.
E agora a longa resposta ...
Se o seu destino de implantação for inferior a iOS 6.0 ou Mac OS X 10.8
Você precisa usar dispatch_retain
e dispatch_release
na sua fila. A ARC não os gerencia.
Se o seu destino de implantação for iOS 6.0 ou Mac OS X 10.8 ou posterior
ARC gerenciará sua fila para você. Você não precisa (e não pode) usar dispatch_retain
ou dispatch_release
se o ARC estiver ativado.
Detalhes
A partir do iOS 6.0 SDK e do Mac OS X 10.8 SDK, cada objeto de envio (incluindo a dispatch_queue_t
) também é um objeto Objective-C. Isso está documentado no <os/object.h>
arquivo de cabeçalho:
* 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.
Isto significa que você pode armazenar sua fila em uma NSArray
ou NSDictionary
, ou em uma propriedade com um dos strong
, weak
, unsafe_unretained
, assign
, ou retain
atributos. Isso também significa que se você se referir à sua fila de um bloco, o bloco manterá a fila automaticamente.
Portanto, se seu destino de implantação for pelo menos iOS 6.0 ou Mac OS X 10.8 e você tiver o ARC habilitado , o ARC manterá e liberará sua fila e o compilador sinalizará qualquer tentativa de uso dispatch_retain
ou dispatch_release
como um erro.
Se o seu destino de implementação é de pelo menos iOS 6.0 ou Mac OS X 10.8, e você tem ARC desativado , você deve manter manualmente e liberar sua fila, quer 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 evitar que o compilador veja sua fila como um objeto Objective-C definindo OS_OBJECT_USE_OBJC
para 0
. Por exemplo, você pode colocar isso em seu .pch
arquivo (antes de quaisquer #import
declarações):
#define OS_OBJECT_USE_OBJC 0
ou você pode adicionar OS_OBJECT_USE_OBJC=0
como uma macro de pré-processador nas configurações de compilação. Se você definir OS_OBJECT_USE_OBJC
como 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
.
dispatch_release
eNULL
o objeto em seudealloc
código 5.1 . Caso contrário, algo (código gerado pelo compilador? O próprio tempo de execução?) Tentará liberar o objeto uma segunda vez.Apenas um acompanhamento aqui ... Se o seu destino mínimo de implantação é iOS 6, o ARC agora os gerencia.
fonte