¿Alguna vez tengo que llamar a dispatch_release en ARC?

(Pero esta pregunta es totalmente diferente)

Este ejemplo de código no ARC configura un timer basado en GCD y llama a dispatch_release para un object dispatch_source_t:

__block BOOL done = NO; dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue()); if (timer) { uint64_t milliseconds = 100ull; uint64_t interval = milliseconds * NSEC_PER_MSEC; uint64_t leeway = 10ull * NSEC_PER_MSEC; __block typeof(self) _self = self; dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), interval, leeway); dispatch_source_set_event_handler(timer, ^{ //[_progressBar setProgress:exportSession.progress animated:YES]; if (done) { dispatch_source_cancel(timer); dispatch_release(timer); _self.exportingMovieLabel.hidden = YES; _self.exportingProgress.hidden = YES; } }); dispatch_resume(timer); } 

Aprendí que no tienes que liberar objects de queue en ARC. ¿Pero otros objects GCD como una fuente de envío?

No, siempre que su objective de implementación sea iOS 6.0 o Mac OS X 10.8 o posterior, como se explica aquí .

Todos los objects GCD son gestionados por ARC, por lo que no necesita administrar explícitamente su memory. Lo que es verdadero para dispatch_queue_t también se aplica a todos los demás objects GCD.

Esto está documentado en <os/object.h> justo arriba de la definición de OS_OBJECT_HAVE_OBJC_SUPPORT .

De forma pnetworkingeterminada, los objects libSystem, como los objects GCD y XPC, se declaran como types Objective-C al build con un comstackdor Objective-C. Esto les permite participar en ARC, en la gestión de RR por el time de ejecución de Blocks y en las fugas de comprobación por el analizador estático, y les permite agregarse a las collections de Cacao.

También puede optar por no participar de este comportamiento con el -DOS_OBJECT_USE_OBJC=0 comstackdor -DOS_OBJECT_USE_OBJC=0 .

Aquí hay una directiva del comstackdor para agregar a su código.

 // If GCD objects are treated as Objective C object then we do not need to call dispatch_release on those GCD object. // Checking if OS_OBJECT_HAVE_OBJC_SUPPORT == 0 ensures we are only releasing GCD objects when they are NOT being treated as Objective C objects. #if OS_OBJECT_HAVE_OBJC_SUPPORT == 0 dispatch_release(timer); #endif