dispatch_queue_t должен быть освобожден с помощью dispatch_release ()? - PullRequest
7 голосов
/ 24 февраля 2012

У меня есть два GCD блока, которые являются асинхронными.Первый предназначен для фонового потока, второй - для основного потока.Это прекрасно работает, но я только что видел, как кто-то говорил, что мне может понадобиться выпустить их, используя 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

Это правда?Я должен выпустить их здесь?

Ответы [ 2 ]

13 голосов
/ 24 февраля 2012

Вам нужно только освободить очередь, созданную с помощью dispatch_queue_create. Основная очередь будет существовать всегда, и освобождать ее не имеет смысла.

Любые блоки, добавленные в очередь, сохранят саму очередь, поэтому вы можете безопасно звонить dispatch_release(queue) после вашего dispatch_async вызова. Лучше всего делать это вне блока после кода, который вы написали здесь.

8 голосов
/ 24 февраля 2012

Выпускать только те очереди, которые вы создали;не освобождайте основную очередь или глобальные параллельные очереди (или, опять же, любые, которые вы не создали самостоятельно).Также не очень хорошая идея вкладывать релиз в рабочий блок, поставленный в очередь в этой очереди, как вы делаете, потому что это делает его в неправильной области видимости и это:Вы позже измените код, чтобы добавить это 2 dispatch_async().Лучшее стилистическое решение - всегда объединять ваши вызовы создания / выпуска в одной и той же области, при условии, что вы можете это сделать.

...