Подтвердить что ты не робот

Какое свойство следует использовать для очереди отправки после ARC?

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

@property (nonatomic, assign) dispatch_queue_t filterMainQueue;

И в init:

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

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

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

4b9b3361

Ответ 1

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

В текущих OS X и iOS объекты отправки теперь обрабатываются объектами Obj-C ARC. Они будут управляться памятью так же, как объекты 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.

Ответ 2

Вот как определить свойство 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.

Ответ 3

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

@property (readwrite, strong, nonatomic) __attribute__((NSObject)) dispatch_queue_t queue;

Ответ 4

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

Ответ 5

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 (pre-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.
 */