2016-04-05 3 views
3

Я пытаюсь запустить код, но его отчет утечки памяти при использовании статического анализатора. на этой линии, так как потенциальные утечки объекта хранится в «encodedData»obejective c - Потенциальная утечка объекта, хранящегося в

return encodedData; 

Check image here

+0

использование __bridge_transfer –

+0

Благодарим за воспроизведение. –

+0

Используйте autorelease. Компилятор автоматически освободит его после оператора return. –

ответ

4

использования __bridge_transfer

Использование __bridge_transfer гарантирует, что ARC выпустит объект для вас. Без __bridge_transfer вы должны освободить возвращенный объект вручную.

1

__bridge, __bridge_transfer ключевые слова используются для того, чтобы сообщать системе ARC, как обращаться с вашими указателями non-object-c. В сущности, если вы используете __bridge, вы сообщаете ARC, чтобы не иметь дело с правом собственности на преобразованный указатель, потому что вы освободите его от кода без объектива-c, скорее всего с помощью функции free() или CFRelease .... С другой стороны, __bridge_transfer передает право собственности на ARC, и ARC освободит объект объектной-c (и, следовательно, также оригинальный объект non-object-c) через стандартный механизм выпуска, когда ссылки на этот объект достигнут нуля.

Reference

0

Проблема заключается в том, что вы создаете строку, используя методы CoreFoundation. И по умолчанию ARC не знает, что с ним делать. Таким образом, вы несете ответственность за ручное управление памятью для созданного объекта (например, с помощью CFRelease) или передачу его в ARC.

Более поздний, я считаю, способ пойти в вашем случае. Вы можете сделать это, как уже отмечали другие, используя __bridge_transfer.

Смежные вопросы