Краткий ответ: ДА, 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
.
dispatch_release
иNULL
объект вdealloc
коде 5.1 . В противном случае что-то (код, сгенерированный компилятором? Сама среда выполнения?) Попытается освободить объект во второй раз.Просто продолжение здесь ... Если ваша минимальная цель развертывания - iOS 6, ARC теперь управляет ими.
источник