2009-03-20 3 views
9

Нужна консультация о том, как отладить это. Я новичок в ограниченных средах и не имею никаких предыдущих встроенных или умных программ программирования, поэтому я мог бы использовать некоторые подсказки. Уже известно о: Приборы, классический анализ Clanger, обзор кода вручную и т. Д. Инструменты, кажется, очень полезны в общем, но довольно много времени и замерзают много времени! Клайпер также очень помог мне. Похоже, я просто поглощаю слишком много памяти в целом, и мне интересно, какая хорошая стратегия. Выпустить некоторые объекты верхнего уровня? Есть ли «предпочтительная стратегия»?Лучший подход к отладке приложенияDidReceiveMemoryWarning на iPhone?

Просто интересно, разрешил ли кто-либо это успешно, и если у них есть другие предложения? Спасибо всем.

ответ

2

В основном вы получаете это предупреждение, потому что (неудивительно) iPhone опасно низко в памяти. Обычно это может быть по одной из двух причин;

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

Для первого следует запустить приборы и изучить распределения памяти. Это может действительно замедлить работу вашего приложения (и требует дополнительной памяти), поэтому попробуйте тестировать области своего приложения по одному за раз. Например. если у вас несколько просмотров, переключайтесь между ними пару раз.

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

Это общие правила, которые я могу предложить, не зная больше о вашем приложении.

К сожалению, нет реального способа (что я знаю), чтобы получить цифры для текущего распределения памяти из ОС iPhone. Это действительно затрудняет выделение областей вашего приложения, которые непреднамеренно голодают.

+1

3. Вам нужно иметь дело с сетевыми xml/изображениями/данными, которые нельзя сразу загрузить в память (например, на рабочем столе) и должны обрабатываться меньшими частями. – slf

+0

Что касается идей для лучшего дизайна , пример SQLite Books в документе Apple описывает одну стратегию гидратации/обезвоживания. Readme дает отличное объяснение концепции и содержит объекты данных, которые реализуют этот шаблон. – hyuan

5

В приложении для iPhone есть много хороших статей для управления памятью. Вот несколько полезных ссылок.

Вещь вы должны вообще заботиться о

  1. Выпуска любых переменных, которые вам не нужны
  2. Всегда обрабатывать didReceiveMemoryWarning и освободить все переменные не используются
  3. Остановить любые памяти тяжелые процессы в applicationDidReceiveMemoryWarning как аудио/видео игры, UIImagePickerController и т.д.

EDIT Это не относится больше. imageNamed: имел проблемы с кешированием до версий 3.x OS.Эта проблема больше не существует, и вы должны использовать imageNamed: (упрощает реализацию отображения сетчатки)

  1. НЕ используйте imageNamed: для создания объектов UIImage.
+0

Я знаю, что это старо, но просто интересно, почему № 4 выше? Что не так с использованием imageNamed? – ferdil

+3

Образ imageNamed: точка теперь не применяется. До 3.x, imageNamed используется для кэширования изображений, увеличивающих объем памяти, используемый приложением. Теперь они значительно улучшили его. Таким образом, с помощью 3.x и выше вы можете использовать этот метод. – lostInTransit