Почему 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-объекты для меня?
Ответы
Ответ 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/...