Поддерживает ли ARC очереди отправки? - PullRequest
93 голосов
/ 23 декабря 2011

Я читаю документацию Apple по «Управлению памятью для очередей отправки»:

Даже если вы реализуете приложение для сбора мусора, вы все равно должны сохранять и освобождать свои очереди отправки и другие объекты отправки,Grand Central Dispatch не поддерживает модель сбора мусора для восстановления памяти.

Я знаю, что ARC не сборщик мусора, но я хотел бы быть уверен, что мне не нужно dispatch_retain и dispatch_releasemy dispatch_queue_t

Ответы [ 2 ]

232 голосов
/ 23 декабря 2011

Краткий ответ: ДА, 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.

23 голосов
/ 01 августа 2012

Здесь просто продолжение ... Если минимальная цель развертывания - iOS 6, ARC теперь управляет ими.

...