Коротка відповідь: ТАК, ARC зберігає та звільняє черги відправлення.
А тепер довга відповідь ...
Якщо ваша ціль розгортання нижча ніж iOS 6.0 або Mac OS X 10.8
Вам потрібно використовувати dispatch_retainі dispatch_releaseв черзі. ARC ними не керує.
Якщо вашою метою розгортання є iOS 6.0 або Mac OS X 10.8 або новішої версії
ARC буде керувати вашою чергою за вас. Вам не потрібно (і не можна) використовувати dispatch_retainабо dispatch_releaseякщо ARC увімкнено.
Деталі
Починаючи з iOS 6.0 SDK та Mac OS X 10.8 SDK, кожен об'єкт відправлення (включаючи a dispatch_queue_t) також є об'єктом Objective-C. Це задокументовано у <os/object.h>файлі заголовка:
* By default, libSystem objects such as GCD and XPC objects are declared as
* Objective-C types when building with an Objective-C compiler. This allows
* them to participate in ARC, in RR management by the Blocks runtime and in
* leaks checking by the static analyzer, and enables them to be added to Cocoa
* collections.
*
* NOTE: this requires explicit cancellation of dispatch sources and xpc
* connections whose handler blocks capture the source/connection object,
* resp. ensuring that such captures do not form retain cycles (e.g. by
* declaring the source as __weak).
*
* To opt-out of this default behavior, add -DOS_OBJECT_USE_OBJC=0 to your
* compiler flags.
*
* This mode requires a platform with the modern Objective-C runtime, the
* Objective-C GC compiler option to be disabled, and at least a Mac OS X 10.8
* or iOS 6.0 deployment target.
Це означає , що ви можете зберігати ваші черги в NSArrayабо NSDictionary, або в будинку з одним з strong, weak, unsafe_unretained, assign, або retainатрибутів. Це також означає, що якщо ви посилаєтесь на свою чергу з блоку, блок автоматично збереже чергу.
Отже, якщо вашою ціллю розгортання є принаймні iOS 6.0 або Mac OS X 10.8, і у вас увімкнено ARC , ARC збереже і звільнить вашу чергу, а компілятор позначить будь-яку спробу використання dispatch_retainабо dispatch_releaseяк помилку.
Якщо ваша мета розгортання принаймні IOS 6.0 або Mac OS X 10.8, і у вас є ARC відключена , необхідна вручну зберегти і звільнити свою чергу, або зателефонувавши по телефону dispatch_retainі dispatch_release, або шляхом відправки черзі retainі releaseповідомлення (як [queue retain]і [queue release]).
Для сумісності зі старою базою коди, ви можете запобігти компілятор бачити вашу чергу як об'єкт Objective-C, визначивши OS_OBJECT_USE_OBJCдля 0. Наприклад, ви можете помістити це у свій .pchфайл (перед будь-якими #importтвердженнями):
#define OS_OBJECT_USE_OBJC 0
або ви можете додати OS_OBJECT_USE_OBJC=0як макрос препроцесора у налаштуваннях збірки. Якщо ви встановите OS_OBJECT_USE_OBJCзначення 0, ARC не буде зберігати або звільняти вашу чергу для вас, і вам доведеться зробити це самостійно, використовуючи dispatch_retainта dispatch_release.