dispatch_queue_t freigegeben werden müssen mit dispatch_release()?
Habe ich zwei GCD
Blöcke, die sind async. Die erste ist für den hintergrund-thread, der zweite läuft auf dem main thread. Dies funktioniert gut, aber ich sah nur irgendwo reden, dass ich vielleicht brauchen, um Sie zu befreien mit dispatch_release()
. E. g.:
//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
Ist das wahr? Brauche ich die Freigabe, Sie hier?
- Gemäß den Kommentaren in der header-Datei benötigen Sie zum aufrufen dispatch_release() für jede Warteschlange, die Sie erstellen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur release-Warteschlangen, die Sie erstellen; keine Freigabe für die Haupt-queue oder der globalen concurrent queues (oder, wieder, alle, die Sie nicht selbst erstellen). Es ist auch keine gute Idee zu brüten, die Freigabe innerhalb der Arbeit block eingereiht, die auf dieser Warteschlange, wie du tust, denn das tut es im falschen Bereich und so:
Wird nicht funktionieren, wenn Sie später ändern Sie den code hinzufügen, dass der 2.
dispatch_async()
. Immer koppeln Sie Ihre erstellen/release Aufrufe im gleichen Umfang, vorausgesetzt, dass Sie können, ist eine bessere stilistische Wahl.Müssen Sie nur lassen Sie die erstellte Warteschlange mit
dispatch_queue_create
. Die main queue wird immer existieren, und es macht keinen Sinn, es zu veröffentlichen.Alle Blöcke der Warteschlange Hinzugefügt werden, behalten die queue selbst, so können Sie sicher nennen
dispatch_release(queue)
nach Ihremdispatch_async
nennen. Am besten tun Sie dieses außerhalb der block nach dem code, den Sie hier geschrieben habe.