Понимание инструмента для проверки утечки памяти - iPhone
Выше приведенные изображения из моего приложения утечки.
Здесь я хочу понять, что в Extended Detail - вы можете видеть различные цвета, такие как светло-зеленый, светло-розовый, светло-коричневый, светло-фиолетовый.
На что указывает каждый цвет?
Теперь другая путаница: "Как найти код, который создает утечку памяти?"
До какого предела утечки памяти - фактический iPhone может продолжаться. (предположим, что 10 байтов не проблема, 20 байтов не проблема и 200 байтов проблема)
- На что указывает каждый цвет?
- Каким цветом обозначен наш код / Из каких деталей мы можем добраться до кода, где мы разместили объект и забыли его освободить?
(Например - при нажатии на вторую ячейку UIKit подробно - мы не можем получить код)
- Почему мы должны устранить все утечки? - даже одна утечка может засорить iPhone?
- Почему iPhone позволяет утечкам оставаться в памяти? / почему сборка мусора не выполняется автоматически после завершения работы приложения?
- Если я пытаюсь освободить объекты, которые должны быть освобождены в соответствии с инструментами, Мое приложение завершается ненормально. Если я не освобождаю, мое приложение работает отлично, как?
- Почему рекомендуется подождать в режиме просмотра до 10 и более секунд, если есть утечка, прибор обнаружит утечку?
5 ответов
Не обращайте внимания на цвета, в этом [DashBoard viewDidLoad] является источником утечки, что-то в том, как он инициализирует URLConnection (возможно, вы не освободили это, когда соединение было установлено?)
Теперь, чтобы ответить на другие ваши вопросы:
- Почему мы должны устранить все утечки? - даже одна утечка может засорить iPhone?
Да. Частично причина заключается не только в том, что у вас просто не хватит памяти, а в связи с тем, что для всего телефона остается слишком много памяти, сторожевое приложение постоянно следит за вашим приложением и рано выключит его, если обнаружит использование памяти. только когда-либо растет...
- Почему iPhone позволяет утечкам оставаться в памяти? / почему сборка мусора не выполняется автоматически после завершения работы приложения?
Вся память вашего приложения освобождается при выходе из приложения.
- Если я пытаюсь освободить объекты, которые должны быть освобождены в соответствии с инструментами, Мое приложение завершается ненормально. Если я не освобождаю, мое приложение работает отлично, как?
Здесь я ничего не могу поделать, вам действительно нужно больше узнать о цикле сохранения / освобождения памяти... если вы отпустите объект с счетом сохранения 0, приложение вылетает, потому что объект исчез.
- Почему рекомендуется подождать в режиме просмотра до 10 и более секунд, если есть утечка, прибор обнаружит утечку?
Поскольку инструменты работают путем выборки из памяти очень часто, таким образом, инструментам может понадобиться немного времени, чтобы начать чтение памяти после действия.
Прежде всего, вещи в стеке окрашены тем, из какой библиотеки они берутся, поэтому в них не так много информации.
Во-вторых, вместо того, чтобы беспокоиться о том, сколько утечек может принести iPhone, я бы сосредоточился на том, чтобы не допустить утечки.
Чтобы найти утечки, есть несколько вариантов:
- Используйте статический анализатор CLANG при создании проекта
- Ищите утечки вручную. Вы всегда должны следовать Правилам управления памятью: если вы
alloc
,retain
, или жеcopy
объект (включая использование@property (retain)
или же(copy)
), вы должныrelease
или жеautorelease
Это.
Цвета представляют разные библиотеки, через которые проходит стек вызовов.
Утечка вызвана кадром в вашем коде, который произвел выделение, даже если фактическое выделение происходит глубоко внутри библиотеки ОС. Прибор показывает , где именно была выделена утечка памяти. Вы должны выяснить, какая строка в вашем коде привела к утечке выделения, и это будет один из кадров в стеке справа.
Фактический iPhone не имеет много оперативной памяти, доступной для вашего приложения. Я склонен оценивать около 25 МБ оперативной памяти для моего приложения для работы. Любая утечка, какой бы маленькой она ни была, может потопить пресловутый корабль, если код используется достаточно.
Ищите имя вашего приложения в расширенном представлении стека. Распределение памяти обычно показывается в конце, поэтому вы точно знаете, какая библиотека отвечает за выделение памяти. Таким образом, вы должны проследить от строки, где ваш код появляется вниз до конца. Цвета облегчают отслеживание строк кода, связанных с теми же библиотеками. Те же библиотечные вызовы будут окрашены в тот же цвет.
Что касается отслеживания самой утечки. Сначала перейдите к вызову вашего приложения, дважды щелкнув по строке в расширенном представлении и попытайтесь понять, что именно подтекает. Иногда вы можете заменить утечку звонка не протекающей заменой. Например, я использовал вызов imageNamed для извлечения изображений из комплекта, приложение постоянно зависало из-за нехватки памяти. Я только что гуглил imageNamed leaks и нашел очень полезную статью о том, как использовать изображения наличными в моем приложении. Действительно, API-интерфейс imageNamed протекает. Есть API, который просачивается в iphone SDK.
Кроме того, попробуйте проверить, как вы работаете с alloc / retain / release и т. Д., Освобождаете ли вы или автоматически освобождаете выделенную память.
Удачи в вашей детективной работе.
У меня тоже есть проблемы с утечками в инструментах. Сегодня я впервые запустил свое приложение, используя утечки, и обнаружил несколько утечек. Утечки, которые не должны быть утечками, потому что у них нет возможности утечки, если только не выполняется какой-то магический код и не увеличивается количество сохраняемых объектов. Я понимаю рекомендации по управлению памятью, знаю, как использовать пулы с автоматическим выпуском и т. Д. Но даже пустое приложение, основанное на представлении, содержало утечки, если на него было наложено несколько элементов управления. И просто нажмите около 2-3 раза. Идите и попробуйте. Я не совсем понимаю, какие информационные инструменты пытается предоставить. Являются ли эти "утечки" действительно утечками, или это просто вещи, которые являются подозрительными для приложения инструментов? Должно ли пустое приложение без кода пользователя, только несколько элементов управления, помещать пустое представление в утечку памяти?