Краткий ответ: ДА, 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, каждый объект отправки (включая 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
.