2013-07-31 4 views
1

Я искал вокруг правильного пути, чтобы перейти от CFStringRef к NSString в АРК, чтобы избежать утечек памяти, а некоторые из основных голосовали ответы предполагают:CFStringRef для утечки ARC NSString. Зачем?

NSString * string = (__bridge NSString *)cfString; 

Я использую этот подход здесь, но при профилировании приложения Я все еще получаю утечку памяти в этом маленьком методе [см. Прикрепленное изображение].

Итак, я не знаю, как это исправить. У кого-нибудь есть решение этой проблемы?

Спасибо

enter image description here

enter image description here

Таким образом, по-видимому, добавление CFRelease(ext) перед возвращением зафиксировал утечку. Проблема в том, что я не думаю, что полностью понимаю причину. Я думал, что линия:

NSString * extension = (__bridge NSString*)ext 

Приобретает право собственности на строку Foundation Foundation ext и обрабатывает выпуск. Неужели кто-нибудь может объяснить, что здесь происходит?

+0

О, и это написано «exten *** S *** ion» ... –

ответ

6

В соответствии с де-факто «стандарт» Cocoa именовании, функции, которые содержат Create или Copy их имени возвращают объект с эталонным подсчета 1. Вы должны передать этот счетчик ссылок в АРК-земля так что ARC может позаботиться об этом. Для этой цели используется ключевое слово __bridge_transfer.

NSString *string = (__bridge_transfer NSString *)cfString; 
+0

С другой стороны, я снова спрашиваю: ARC должна была облегчить управление памятью. Но, честно говоря, почему '__bridge_transfer' лучше, чем' [string release] '? Мы ** все еще ** должны беспокоиться о подсчетах ссылок, но по крайней мере сейчас это уродливо. ** –

+0

Возможно, в ближайшее время вам не придется беспокоиться о мостовых переходах. – Robert

+2

Вы делаете мосты только тогда, когда танцуете на краю ARC, поэтому вы делаете гораздо меньше мостов, чем вы делали релизы на MRC. – Tricertops

4

Освободите объект ext или используйте __bridge_transfer.

Позвольте мне объяснить это немного в том, как я понимаю это:

  • __bridge - Нормальная отливку. Количество удержания литого объекта частично управляется ARC и частично вручную. Вам необходимо освободить существующую собственность на стороне CF.

  • __bridge_transfer - «Преобразует CF объект в объект NS». Количество удержания заброшенного объекта полностью управляется ARC. Существующая собственность на стороне CF предназначена для вас.

+0

CFRelease (ext) также работает. Так что это тоже правильно. Я отметил ответы H2CO3 как правильные, так как он пришел первым, но оба ответа верны (по крайней мере, по инструментам). Утечка памяти больше не появляется. – zumzum

+0

Спасибо. Да, важно время;) – Tricertops

+1

'__bridge' может быть лучше описан как« просто бросить его без эффектов управления памятью ». Если он был сохранен, он все равно сохраняется. Если он не был сохранен, он все еще обречен. '__bridge_transfer' не« конвертирует объект CF в объект NS »(там, где есть класс CF и класс NS, которые являются« бесплатными мостами », любой объект одного класса * уже является * объектом другого; , CFString * является * NSString и наоборот), но остальная часть этого элемента верна. '__bridge_retained' фактически является обратным для передачи: он и бросает, и' CFRetain 'является объектом. –