Коротка відповідь: ТАК, 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
.