Недостаточно памяти в XCode, но не в инструментах

Моему приложению не хватает памяти. В отчете о памяти XCode я вижу, что использование памяти на устройстве увеличивается до чуть более 500 МБ, прежде чем оно будет выключено.

При профилировании в Инструментах (либо с помощью инструмента распределения, либо инструмента утечки) этого не происходит. Процесс занимает около 100 МБ и балансируется, поскольку он выполняет часть задачи, интенсивно использующую память. Приложение не вылетает при запуске в Инструментах.

Что может вызвать расхождение?

Интенсивный процесс использует UIWebView для определения длины нескольких страниц контента. Веб-представление находится в фоновом режиме и загружает страницу. По завершении загрузки он вычисляет размер и загружает следующую страницу до тех пор, пока не будет рассчитана длина всех страниц.

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

После этого я попытался предположить, что выделение и освобождение памяти происходит правильно, но я просто выделяю память быстрее, чем система может перераспределить память. Я попытался остановить процесс до того, как закончится память, чтобы посмотреть, упадет ли использование памяти. В отчете XCode о памяти сообщается о небольшом падении, но незначительном, даже после того, как он простоит несколько минут.

Мой следующий шаг — попытаться упростить процесс, пока проблема не будет устранена.

Кто-нибудь еще сталкивался с чем-то подобным, когда приложение в «Инструментах» делает что-то совершенно иное, чем не в «Инструментах», или есть какое-либо объяснение того, что может вызвать это?


person mwu    schedule 21.08.2014    source источник
comment
Попробуйте использовать @autoreleasepool чаще.   -  person Cy-4AH    schedule 21.08.2014
comment
Я бы посмотрел на две схемы и убедился, что настройки одинаковы. Возможно, профилировщик использует конфигурацию без отладки, а run использует конфигурацию отладки. Я бы также уделил особое внимание использованию зомби в последнем случае, поскольку это может занимать память, отслеживая все освобожденные объекты. См. developer.apple.com/library/mac/recipes. /   -  person Rob    schedule 21.08.2014
comment
@Rob Спасибо, проблема оказалась в настройке зомби. Раньше я проверял конфигурации между профилировщиком и запуском, но пропустил настройку зомби. Если вы отправите свой комментарий в качестве ответа, я приму его.   -  person mwu    schedule 21.08.2014


Ответы (1)


Я бы посмотрел на две схемы и убедился, что настройки одинаковы. Возможно, профилировщик использует конфигурацию без отладки, а «Выполнить» использует конфигурацию отладки.

Я бы обратил особое внимание на «Включить объекты-зомби» в «Диагностика" на вкладке "Выполнить", так как это может занимать память для отслеживания всех освобожденных объектов. Зомби — прекрасный диагностический инструмент, но вы хотите отключить его, чтобы гарантировать, что вы восстановите всю память, связанную с освобожденными объектами.

Для получения информации о настройке схемы см. https://developer.apple.com/library/mac/recipes/xcode_help-scheme_editor/Articles/SchemeDialog.html.

person Rob    schedule 21.08.2014