Поддерживает ли ARC очереди отправки?

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

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

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

Ответ 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.

Ответ 2

Просто выполните следующие действия... Если ваша минимальная цель развертывания - iOS 6, ARC теперь управляет ими.