ARC: предупреждения анализатора с кодом Objective-C с использованием базовой основы

Использование анализатора на некоторых Objective-C | Код Cocoa/Core Foundation, у меня есть несколько ошибок, которые я не могу исправить, потому что я их не понимаю.

Ошибка №1: в заголовке класса Objective-C я объявляю это свойство.

@property(readwrite) CFMutableSetRef gClients;

В теле получаю следующую ошибку:

введите здесь описание изображения

Вопрос: Почему это утечка? Я храню его в собственности и избавляюсь от него позже. Я думал, что ARC знает, как обращаться с «объектами» CF.

Ошибка №2. Позже при освобождении объекта возникает ошибка:

введите здесь описание изображения

Вопрос. Как я могу учесть эти два предупреждения Analyzer, чтобы создать код, который действительно работает (self.gClients живет между вызовами ClientInitialize и destroyAllClients), но не получает пометки?


person Community    schedule 13.05.2013    source источник


Ответы (1)


ARC не управляет объектами CF без ручного вмешательства. Есть работа, которую нужно сделать в первую очередь.

См. http://www.idryman.org/blog/2012/11/22/arc-best-practices-and-pitfalls/ в разделе «ARC и бесплатные мосты». Есть специальные трюки с (__bridge_transfer).

person StilesCrisis    schedule 13.05.2013
comment
Спасибо за ваш ответ. Как вы предлагаете мне поступить? gClients объявляется как: @property(readwrite) CFMutableSetRef gClients; self.gClients = (__bridge_retained)CFSetCreateMutable(NULL, 0, NULL); приводит к ошибке. - person ; 14.05.2013
comment
__bridge_retained — это модификатор типа, такой как volatile или const. Попробуйте (__bridge_retained CFMutableSetRef). Вы читали статью? Там это довольно четко прописано. - person StilesCrisis; 14.05.2013
comment
__bridge_retained это противоположность тому, что вы и @Adrien хотите здесь. Это сохранит объект снова, когда он уже сохранен функцией Create, которая его вернула. Вам нужен __bridge_transfer, который говорит ARC: «Разберись с этим для меня, хорошо?». (Это упоминается в статье, на которую вы ссылаетесь.) - person Peter Hosey; 16.09.2013