Ответ 1
Краткий ответ: ДА, 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.
Подробнее
Начиная с SDK iOS 6.0 и SDK Mac OS X 10.8, каждый объект отправки (включая 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
.