7

Ho due blocchi GCD asincroni. Il primo è per il thread in background, il secondo viene eseguito sul thread principale. Funziona alla grande, ma ho visto da qualche parte che avrei potuto doverli rilasciare usando dispatch_release(). Es .:dispatch_queue_t deve essere rilasciato usando dispatch_release()?

// 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 

È vero? Devo rilasciarli qui?

+0

Per i commenti nel file di intestazione è necessario richiamare dispatch_release() su qualsiasi coda che si crea. – BonanzaDriver

risposta

8

Solo le code di rilascio create; non rilasciare la coda principale o le code simultanee globali (o, ancora, quelle che non hai creato tu stesso). Non è anche una buona idea per nidificare il rilascio all'interno del blocco di lavoro accodato su quella coda, come si sta facendo, perché questo sta facendo nel campo di applicazione sbagliata e questo:

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

non funziona quando più tardi cambia il codice per aggiungere quel 2 dispatch_async(). Associare sempre le chiamate di creazione/rilascio nello stesso ambito, supponendo che sia possibile, è una scelta stilistica migliore.

+0

Ok, quindi ho solo bisogno di rilasciarlo al di fuori della chiamata dispatch_asynch? –

+0

Sì. Nello specifico, è necessario farlo nello stesso ambito della chiamata di creazione per evitare che tu imposti una mina per te che successivamente procederai, come illustrato nella mia risposta (l'unica eccezione a questa regola potrebbe essere quella dei finalizzatori, ma non parliamo confondere le cose :)) – jkh

13

È necessario solo rilasciare la coda creata con dispatch_queue_create. La coda principale esisterà sempre e non ha senso rilasciarla.

eventuali blocchi aggiunti alla coda manterrà la coda stessa, in modo da poter tranquillamente chiamare dispatch_release(queue) dopo la vostra dispatch_async chiamata. Meglio farlo fuori dal blocco dopo il codice che hai scritto qui.

+0

Ok, ma se lo faccio fuori dalla coda, non verrà rilasciato automaticamente? –

+2

@NicHubbard Verrà rilasciato quando tutto il lavoro della coda è terminato, ad esempio è possibile creare una coda, inviare da 3 a 4 blocchi e rilasciarlo dopo le chiamate di spedizione. La coda rimarrà conservata fino a quando tutti i blocchi non avranno terminato le attività corrispondenti. A questo punto non hai più bisogno di questa coda. – Pochi