Ответ 1
В документации разработчика содержится следующее:
Очереди отправки и другая отправка объекты - данные с подсчетом ссылок типы. Когда вы создаете серию очереди отправки, он имеет начальную счетчик ссылок 1. Вы можете использовать отправка и отправка_отправка функции для увеличения и уменьшения эта ссылка подсчитывается по мере необходимости. когда подсчет ссылок в очереди ноль, система асинхронно освобождает очередь.
Когда ваше приложение больше не требуется очередь отправки, она должна освободить это с функцией dispatch_release. Любые отложенные блоки, представленные в очередь удерживает ссылку на эту очередь, поэтому очередь не освобождается до тех пор, пока все ожидающие блоки завершены.
Примечание. Вам не нужно сохранять или освободить любую глобальную отправку очереди, включая параллельные диспетчерских очередей или основной отправки очередь. Любые попытки сохранить или освобождение очередей игнорируются.
Таким образом, везде, где бы вы ни воспользовались, воспользуйтесь диспетчерской отправкой и в любом месте, которое вы использовали бы - освободите использование dispatch_release.
Очереди отправки следуют тем же общим соглашениям об управлении памятью, что и объекты objective-c. И они не будут отменены до тех пор, пока все блоки в очереди не закончатся.
Если вам нужен способ закрыть очередь отправки: нет способа отменить все блокированные блоки с помощью любого API, поэтому они всегда должны выполняться до завершения. Одним из способов ускорения этого процесса является наличие переменной BOOL в классе, управляющем очередью отправки: _isValid. Когда вы хотите закрыть очередь, вы можете установить _isValid в NO. Все блоки, отправленные в очередь, должны сначала проверить _isValid перед выполнением любой работы.
Комментарий стороны: может быть более целесообразным использовать NSOperationQueue. См. Chris Hanson сообщение в блоге.