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

Почему ARC жалуется на dispatch_queue_create и dispatch_release в iOS 6?

Я объявил свойство ссылаться на очередь GCD:

@property (assign) dispatch_queue_t backgroundQueue;

В методе init класса я создаю очередную очередь:

backgroundQueue = dispatch_queue_create("com.company.app", DISPATCH_QUEUE_SERIAL);

ARC жалуется: "Присвоение сохраненного объекта переменной unsafe_unretained, объект будет освобожден после назначения"

Должен ли я использовать __bridge_transfer?

В -dealloc я освобождаю очередь:

dispatch_release(backgroundQueue);

Опять же, ARC жалуется: "ARC запрещает явное сообщение отправки" release "

Я нахожу это запутанным, потому что это вызов функции C, а мыслительные очереди - это объекты C, для которых я должен сам позаботиться об управлении памятью! С каких пор ARC обрабатывает C-объекты для меня?

4b9b3361

Ответ 1

В iOS 6 вы можете выбрать cmd + click dispatch_queue_t и увидеть это:

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

Так просто используйте сильное свойство (если в очереди не указано другое место, и вам действительно нужна слабая ссылка).

Перед iOS 6 вам нужно сделать управление памятью самостоятельно, используя dispatch_retain и dispatch_release. Выполнение этого в iOS 6 вызовет ошибку компилятора.

Ответ 2

Это сообщение об ошибке появится, если вы используете SDK iOS 6.

В iOS 6.0 SDK и Mac OS X 10.8 SDK каждый объект отправки также является частью объекта C. Таким образом, вы не хотите беспокоиться о памяти, ARC будет управлять памятью dispatch_queue.

Подробнее см. ссылку .

Ответ 3

Вы не должны настаивать на использовании assign. Вы можете использовать:

@property (nonatomic) dispatch_queue_t backgroundQueue;

или даже

@property dispatch_queue_t backgroundQueue;

без предупреждения.

Ответ 4

Магические функции dispatch_retain и dispatch_release определяются на основе множества условий.

Нижняя строка в моих тестах:  - если вы развертываете для sdk 5, используйте их, и все хорошо  - если вы развертываете для sdk >= 6, даже не думайте о них, просто рассматривайте все как объект

Здесь вы можете увидеть лучшее объяснение: fooobar.com/info/39595/...