Как я могу определить, какие объекты содержат ссылки на другие объекты, которые вызывают утечки памяти в t arget-c?
Я пытался использовать инструмент утечки, "анализ" и т. Д., Чтобы найти утечку, но он не может ее найти. Используя выделения, я могу определить объекты, которые не освобождаются.
Я заметил (добавив операторы отладки в метод dealloc), что dealloc не вызывается для этих объектов.
Как я могу определить, какие объекты содержат ссылки на эти объекты и предотвращают их освобождение?
4 ответа
Инструмент анализа не смог обнаружить проблему. Использование инструмента выделения для регистрации всех ссылок было началом, но было так много классов, которые я не распознал или не получил прямого доступа, и я не смог отследить проблему с помощью этого метода. Вместо этого я составил список классов, за которые я непосредственно отвечал, и исследовал каждый из них построчно, пока не обнаружил проблемы. Причиной было то, что я использовал некоторые сторонние библиотеки, которые не уменьшали количество сохраняемых данных некоторых моих объектов, как ожидалось. Я полагаю, что в этом случае следование лучшим принципам разработки программного обеспечения / шаблонам проектирования и тщательный анализ кода могли бы решить проблему раньше.
Если вам нужно увидеть, где хранятся, выпускаются и автоматически выпускаются объекты, используйте инструменты:
Запустите инструменты, в разделе "Выделения" включите "Счетчик ссылок записи" (вы должны остановить запись, чтобы установить опцию). Заставьте сборщик запустить, остановить запись, найти там ivar (datePickerView), выполнить детализацию, и вы сможете увидеть, где произошли все сохранения, выпуски и авто-релизы.
Вы можете перегрузить реализации retain/release/autorelease в проблемных классах (если это класс SDK, можно использовать категорию) и установить там точку останова. Ваша точка останова будет срабатывать каждый раз, когда что-то удерживает ваш объект.
Я бы начал с построения и анализа проекта (команда Shift B в IDE).