¿Se debe liberar dispatch_queue_t usando dispatch_release ()?

Tengo dos bloques GCD que son asíncronos. El primero es para el hilo de background, el segundo se ejecuta en el hilo principal. Esto funciona muy bien, pero acabo de ver en algún lugar hablando que podría necesitar liberarlos usando dispatch_release() . P.ej:

 // Use gcd dispatch_queue_t queue = dispatch_queue_create("com.awesome", 0); dispatch_queue_t main = dispatch_get_main_queue(); // do the long running work in bg async queue // within that, call to update UI on main thread. dispatch_async(queue, ^{ // Do work in the background // Release dispatch_release(queue); dispatch_async(main, ^{ // Main // Release dispatch_release(main); });//end });//end 

¿Es esto cierto? ¿Debo liberarlos aquí?

Solo queues de lanzamiento que cree; no libere la queue principal o las queues simultáneas globales (o, de nuevo, ninguna que no haya creado usted mismo). Tampoco es una buena idea anidar la versión dentro del bloque de trabajo en queue en esa queue, como lo está haciendo, porque eso está haciendo en el scope incorrecto y esto:

 queue = dispatch_queue_create(...) dispatch_async(queue, ^{ something; dispatch_release(queue); }); dispatch_async(queue, ^{ something else}); // CRASH! 

No funcionará cuando cambie el código para agregar 2nd dispatch_async() . Siempre emparejar sus llamadas de creación / liberación en el mismo ámbito, suponiendo que puede, es una mejor opción estilística.

Solo debe liberar la queue creada con dispatch_queue_create . La queue principal siempre existirá y no tiene sentido liberarlo.

Cualquier bloque agregado a la queue retendrá la queue en sí, por lo que puede llamar con security a dispatch_release(queue) después de su llamada dispatch_async . Lo mejor es hacer esto fuera del bloque después del código que has escrito aquí.