Как я могу определить, какие объекты содержат ссылки на другие объекты, которые вызывают утечки памяти в target-c? - PullRequest
10 голосов
/ 29 ноября 2011

Я пытался использовать инструмент утечки, "анализировать" и т. Д., Чтобы найти утечку, но он не может ее найти.Используя выделения, я могу определить объекты, которые не освобождаются.

Я заметил (добавив операторы отладки в метод dealloc), что dealloc не вызывается для этих объектов.

Как определить, какие объекты содержат ссылки на эти объекты и предотвращают ихот освобождения?

Ответы [ 4 ]

11 голосов
/ 29 ноября 2011

Если вам нужно увидеть, где происходит сохранение, разблокирование и автовыделение для объекта, использующего инструменты:

Запустить на инструментах, в разделе «Выделения» включить «Счетчик ссылок записи» (вы должны остановить запись, чтобы установитьопция).Заставьте сборщик запустить, остановить запись, найти там ivar (datePickerView), выполнить детализацию, и вы сможете увидеть, где произошли все сохранения, выпуски и автоматические выпуски.

enter image description here

2 голосов
/ 30 ноября 2011

Инструменту анализа не удалось обнаружить проблему.Использование инструмента выделения для сбора всех ссылок было началом, но было так много классов, которые я не распознал или не получил прямого доступа, я не смог отследить проблему с помощью этого метода.Вместо этого я составил список классов, за которые я непосредственно отвечал, и исследовал каждый из них построчно, пока не обнаружил проблемы.Причина заключалась в том, что я использовал некоторые сторонние библиотеки, которые не уменьшали количество сохраняемых данных некоторых моих объектов, как ожидалось.Я полагаю, что в этом случае следование лучшим принципам разработки программного обеспечения / шаблонам проектирования и тщательный анализ кода могли бы решить проблему раньше.

1 голос
/ 29 ноября 2011

Вы можете перегрузить реализации retain / release / autorelease в проблемных классах (если это класс SDK, можно использовать категорию) и установить там точку останова. Ваша точка останова будет срабатывать каждый раз, когда что-то удерживает ваш объект.

1 голос
/ 29 ноября 2011

Я бы начал с построения и анализа проекта (команда Shift B в IDE).

...