Понимание инструмента для проверки утечки памяти - iPhone - PullRequest
6 голосов
/ 25 августа 2009

alt text

Выше приведены изображения с утечками из моего приложения.

Здесь я хочу понять, что в Extended Detail вы можете видеть различные цвета, такие как светло-зеленый, светло-розовый, светло-коричневый, светло-фиолетовый.

Что означает каждый цвет?

Теперь другая путаница: «Как найти код, который создает утечку памяти?»

До какого предела утечки памяти - фактический iPhone может продолжаться. (допустим, 10 байтов не проблема, 20 байтов - нет, 200 байт - проблема)

  • Что обозначает каждый цвет?
  • Каким цветом обозначен наш код / ​​Из каких деталей мы можем получить код, в котором мы выделили объект и забыли его освободить?

(Например, при подробном нажатии на вторую ячейку UIKit - мы не можем получить код)

  • Почему мы должны устранить все утечки? - даже одна утечка может засорить iPhone?
  • Почему iPhone позволяет утечкам оставаться в памяти? / почему сборка мусора не выполняется автоматически после завершения работы приложения?
  • Если я пытаюсь освободить объекты, которые должны быть освобождены в соответствии с инструментами, Мое приложение завершается ненормально. Если я не освобождаю, мое приложение работает отлично, как?
  • Почему предполагается, что вы ожидаете в просмотре до 10 или более секунд, если есть утечка, прибор обнаружит утечку?

Ответы [ 5 ]

14 голосов
/ 25 августа 2009

Игнорировать цвета, в этом случае [DashBoard viewDidLoad] является источником утечки, что-то в том, как он инициализирует URLConnection (возможно, вы не освободили это, когда соединение было установлено?)

Теперь, чтобы ответить на другие ваши вопросы:

  • Почему мы должны устранить все утечки? - даже одна утечка может засорить айфон?

Да. Частично причина заключается не только в том, что у вас просто не хватит памяти, а в связи с тем, что для всего телефона остается слишком много памяти, сторожевое приложение постоянно следит за вашим приложением и рано отключит его, если обнаружит использование памяти. только когда-либо растет ...

  • Почему iPhone позволяет оставаться утечкам в памяти? / почему сборка мусора не выполняется автоматически после прекращение подачи заявки?

Вся память вашего приложения освобождается при выходе из приложения.

  • Если я попытаюсь освободить объекты, которые должны быть освобождены в соответствии с инструменты, Моя заявка заканчивается ненормально. Если я не dealloc, моё приложение запускается отлично, как?

Здесь я ничего не могу поделать, вам действительно нужно прочитать больше о цикле сохранения / освобождения памяти ... если вы отпустите объект, у которого счетчик хранения равен 0, приложение вылетает из-за того, что объект исчез.

  • Почему предлагается подождать в просмотр до 10 и более секунд, если есть утечка, утечка будет обнаружены приборами?

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

5 голосов
/ 25 августа 2009

Прежде всего, вещи в стеке окрашены тем, из какой они библиотеки, поэтому она не содержит столько информации.

Во-вторых, вместо того чтобы беспокоиться о том, сколько утечек может принести iPhone, я бы сосредоточился на том, чтобы не допустить утечки.

Чтобы найти утечки, есть несколько вариантов:

  • Используйте статический анализатор CLANG при создании проекта
  • Искать утечки вручную. Вы должны всегда следовать Правилам управления памятью: если вы alloc, retain или copy объект (включая использование @property (retain) или (copy)), вы must release или autorelease it.
3 голосов
/ 25 августа 2009

Цвета представляют различные библиотеки, через которые проходит стек вызовов.

Утечка вызвана кадром в вашем коде, который произвел выделение, даже если фактическое выделение происходит глубоко внутри библиотеки ОС. Instruments показывает вам точно , где была выделена утечка памяти. Вы должны выяснить, какая строка в вашем коде привела к утечке выделения, и это будет один из кадров в стеке справа.

На самом деле у iPhone недостаточно оперативной памяти для вашего приложения. Я склонен оценивать около 25 МБ оперативной памяти для моего приложения для работы. Любая утечка, независимо от того, насколько она мала, может потопить пресловутый корабль, если код используется достаточно.

1 голос
/ 25 августа 2009

Найдите имя вашего приложения в расширенном представлении стека. Распределение памяти обычно показывается в конце, поэтому вы точно знаете, какая библиотека отвечает за выделение памяти. Таким образом, вы должны проследить от строки, где ваш код появляется вниз до конца. Цвета облегчают отслеживание строк кода, связанных с теми же библиотеками. Те же самые библиотечные вызовы будут окрашены в тот же цвет.

Что касается отслеживания самой утечки. Сначала перейдите к вызову приложения, дважды щелкнув строку в расширенном представлении, и попытайтесь понять, что именно происходит. Иногда вы можете заменить утечку звонка не протекающей заменой. Например, я использовал вызов imageNamed для извлечения изображений из комплекта, приложение постоянно зависало из-за нехватки памяти. Я только что погуглил imageNamed leaks и нашел очень полезную статью о том, как использовать изображения наличными в моем приложении. Действительно, API-интерфейс imageNamed протекает. Есть API, который просачивается в iphone SDK.

Также попробуйте проверить, как вы работаете с alloc / retain / release и т. Д., Освобождаете ли вы или автоматически освобождаете выделенную память.

Удачи в вашей детективной работе.

0 голосов
/ 17 июня 2010

У меня тоже проблемы с утечками в приборах. Сегодня я впервые запустил свое приложение, используя утечки, и обнаружил несколько утечек. Утечки, которые не должны быть утечками, потому что у них нет никакого способа утечки, если только какой-то магический код не выполняет и не увеличивает количество сохраняемых объектов. Я понимаю рекомендации по управлению памятью, знаю, как использовать пулы с автоматическим выпуском и т. Д. Но даже пустое приложение, основанное на представлении, содержало утечки, если на него наложили несколько элементов управления. И просто нажмите 2-3 раза. Идите и попробуйте. Я не совсем понимаю, какие информационные инструменты пытается предоставить. Являются ли эти «утечки» действительно утечками, или это просто вещи, которые являются подозрительными для приложения инструментов? Должно ли пустое приложение без кода пользователя, только несколько элементов управления, помещать пустое представление в утечку памяти?

...