Помогите с управлением памятью ... выделение не показывает утечек, но программа протекает как сумасшедшая - PullRequest
1 голос
/ 25 ноября 2010

Таким образом, я автоматически освобождаю / освобождаю каждый объект, который я выделяю / инициализирую / копирую ... и инструмент выделения, похоже, показывает минимальные утечки ... однако ... использование памяти моей программой не перестает увеличиваться. Я включил снимок экрана с выполненным распределением (я выполняю выделение дольше, но оно остается относительно постоянным ... оно, конечно, не сравнится с количеством, которое программа получает при фактическом запуске. При запуске моей программы она удваивается в памяти по сравнению с примерно 10 часов. Однако в первые 5 минут память резко увеличивается (2-3 МБ) и просто продолжает работать. Я не понимаю, почему при работе на инструментах распределение остается постоянным, но моя программа просто продолжает набирать память когда на самом деле запустить.

Поскольку я пока не могу размещать изображения ... вот ссылка на скриншот:

запуск распределений

ОБНОВЛЕНИЕ: Вот некоторые скриншоты из моего анализа кучи памяти ... Я не выделяю эти объекты явно и не знаю, откуда они берутся. Почти все они имеют свой источник с чем-то похожим на подробности второго скриншота справа (множество HTTP и URL в дереве вызовов). Кто-нибудь знает, откуда они? Я знаю, что читал о некоторых утечках NSURLConnection, но я пробовал все очистки кеша, которые те предлагают безрезультатно. Спасибо за всю помощь!

анализ кучи памяти 1

анализ кучи памяти 2

Ответы [ 4 ]

2 голосов
/ 26 ноября 2010
1 голос
/ 26 ноября 2010

Работаете ли вы с разными переменными среды при работе в разных средах?Например, вы можете включить NSZombie при запуске приложения (в результате чего все ваши объекты не будут свободными), но не при запуске в Инструментах?

Только для проверки работоспособности - Как вы определяете памятьиспользование?Вы говорите, что использование памяти продолжает расти, но не во время работы в Instruments.Учитывая, что Instruments - это надежный способ измерения использования памяти (самый надежный способ?), Это звучит немного странно - немного похоже на то, что память продолжает расти, за исключением случаев, когда я пытаюсь ее измерить.

0 голосов
/ 26 ноября 2010

Вы можете использовать Инструменты , чтобы узнать, где находятся ваши ассигнования.При работе Instruments в режиме Allocation :

  • Наведите указатель мыши на поле Category в Сводка объекта
  • Нажмите на Серый круг со стрелкой , которая появляется рядом с именем поля

. Откроется список местоположений, в которых находятся объекты.для этой категории был создан экземпляр, а также статистика того, сколько выделенных ресурсов было сделано каждым.

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

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

0 голосов
/ 25 ноября 2010

Если вы используете объекты с автоматическим выпуском (например, [NSString stringWithFormat:]) в цикле, пул не будет сливаться до тех пор, пока этот цикл не будет завершен, и программе не будет разрешено завершить цикл основного события, после чего пул автоматического выпускаистощается и создается новый экземпляр.

Если у вас есть подобный код, решение состоит в том, чтобы создать новый пул автоматического выпуска перед входом в цикл, затем периодически очищать его во время цикла (и повторно создавать пул автоматического выпуска)после слива).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...