Какое свойство я должен использовать для очереди отправки после ARC? - PullRequest
38 голосов
/ 18 января 2012

Я поддерживаю очередь отправки как свойство с моим контроллером представления.Я создаю эту очередь один раз в методе init моего контроллера представления и повторно использую несколько раз для некоторых фоновых задач.До ARC я делал это:

@property (nonatomic, assign) dispatch_queue_t filterMainQueue;

И в init:

if (filterMainQueue == nil) {
     filterMainQueue = dispatch_queue_create("com.myQueue.CJFilterMainQueue", NULL);
}

Но после ARC я не уверен, должно ли это быть "назначать" или должноэто будет "сильный" или "слабый".Скрипт ARC-конвертора ничего не изменил, но я не уверен, что из-за того, что эта очередь может быть освобождена во время ее использования, возникла небольшая ошибка?

Какая разница между 3 типами свойств и что будет работать лучше всего для очереди отправки при использовании ARC?

Ответы [ 5 ]

60 голосов
/ 18 января 2012

Обновленный ответ:

В текущих OS X и iOS объекты Dispatch теперь обрабатываются ARC как объекты Obj-C.Они будут управляться памятью так же, как объекты Obj-C, и вы должны использовать strong для своего свойства.

Это управляется макросом OS_OBJECT_USE_OBJC, определенным в <os/object.h>.По умолчанию установлено значение 1, если целью развертывания является OS X 10.8 или выше или iOS 6.0 или выше.Если вы развертываете на более старую ОС, тогда это значение 0, и вы должны увидеть мой оригинальный ответ ниже.


Оригинальный ответ:

Отправка объектов (включая очереди) не являются объектами Obj-C, поэтому единственный возможный выбор - assign.Компилятор выдаст ошибку, если вы попытаетесь использовать strong или weak.ARC не влияет на GCD.

9 голосов
/ 20 июля 2014

Вот как можно определить свойство dispatch_queue_t для iOS 6.0 и выше и ниже iOS 6.0

#if OS_OBJECT_HAVE_OBJC_SUPPORT == 1
@property (nonatomic, strong) dispatch_queue_t serialDispatchQueue;
#else
@property (nonatomic, assign) dispatch_queue_t serialDispatchQueue;
#endif

Обычно OS_OBJECT_HAVE_OBJC_SUPPORT определяется как 1 для iOS 6.0 и выше. (MAC 10,8 и выше). Ниже iOS 6 он определен как 0.

OS_OBJECT_HAVE_OBJC_SUPPORT определяет, что объекты ОС, такие как GCD, имеют объективную поддержку C. Таким образом, ARC, управление памятью, подсчет ссылок и т. Д. Применимы к объектам GCD.

5 голосов
/ 13 сентября 2012

Вот что я использую:

@property (readwrite, strong, nonatomic) __attribute__((NSObject)) dispatch_queue_t queue;
4 голосов
/ 12 сентября 2013

На основе iOS7 я проверил, является ли объект dispatch_queue объектом object-C, и выяснил, что они уже являются объектом target-c.перефразируя это, атрибут ((NSObject)) теперь не нужен.

1 голос
/ 16 декабря 2013

TL; DR: dispatch_queue_t теперь объект Objective C, которым можно управлять с помощью ARC.

Я не проверял, насколько далеко это правда, но с использованием iOS 7 SDK и Xcode 5, dispatch_queue_t является типом объекта. Я объявляю свойство для очереди как

@property (nonatomic, strong) dispatch_queue_t syncQueue;

Компилятор доволен и все работает как положено. Я точно знаю, что раньше это не работало в iOS 4 или 5 (до ARC это было retain вместо strong). Я копался в определении для dispatch_queue_t и нашел это:

/*!
 * @typedef dispatch_queue_t
 *
 * @abstract
 * Dispatch queues invoke blocks submitted to them serially in FIFO order. A
 * queue will only invoke one block at a time, but independent queues may each
 * invoke their blocks concurrently with respect to each other.
 *
 * @discussion
 * Dispatch queues are lightweight objects to which blocks may be submitted.
 * The system manages a pool of threads which process dispatch queues and
 * invoke blocks submitted to them.
 *
 * Conceptually a dispatch queue may have its own thread of execution, and
 * interaction between queues is highly asynchronous.
 *
 * Dispatch queues are reference counted via calls to dispatch_retain() and
 * dispatch_release(). Pending blocks submitted to a queue also hold a
 * reference to the queue until they have finished. Once all references to a
 * queue have been released, the queue will be deallocated by the system.
 */
DISPATCH_DECL(dispatch_queue);

Судя по звукам, это не должно работать, поэтому я проверил определение DISPATCH_DECL и нашел это, которое объясняет все:

/*
 * By default, dispatch 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.
 * See <os/object.h> for details.
 */
...