Видите ли вы этот 32 МБ фрагмент VM_ALLOCATE при запуске на устройстве или в симуляторе?
Я спрашиваю, потому что, когда я играл с инструментом выделения в приложении OS X, над которым я работаю, я также заметил 32-мегабайтный фрагмент VM_ALLOCATE, и мне интересно, является ли это побочным продуктом работы в Среда OS X Запуск на устройстве может дать вам другой набор данных.
В общем, резидентная память - это память, используемая вашим приложением, которая не выгружается на диск. На iOS нет подкачки, поэтому резидентная память должна равняться вашей виртуальной памяти.
Грязная память - это память, которую вы распределили и использовали. Грязная память должна быть меньше резидентной памяти, поскольку последняя включает код (ваш и фреймворки).
Я не совсем уверен, что вы делаете в своем приложении, но я думаю, что вы загрузили несколько крупных ресурсов из своего пакета и держите их. Не делайте этого, когда это возможно.
Существуют также API-интерфейсы, которые можно использовать при загрузке объектов NSData, которые используют метод отображения памяти вместо чтения байтов методом перебора. Это может быть лучше, потому что это позволяет ОС лениво читать страницы с диска. С NSData (так как он не изменяем), он также может быть достаточно умным, чтобы пометить страницы только для чтения. Теоретически, это ценный намёк на то, что ОС может очищать эти страницы под давлением, поскольку знает, что они не могут измениться. Прочитайте документы для +[NSData dataWithContentsOfMappedFile:]
.
В отношении изображений я вспоминаю, что читал что-то, что предлагало избегать imageNamed:
, за исключением изображений, которые вы регулярно используете в своем приложении (т.е. элементы пользовательского интерфейса). Особенно для больших изображений они могут оставаться в кеше, который вы не можете контролировать. (imageNamed:
имела утечку в течение 2.x дней, но она была исправлена в 3.x и совершенно безопасна для использования сегодня.) Используйте imageWithContentsOfFile:
для больших изображений и изображений, которые не являются повторяющейся частью вашего пользовательского интерфейса .
Если вы загружаете изображения из сети, кэшируйте их на диске и освобождайте необработанные байты после создания UIImage
. Если представления изображений выгружаются из-за нехватки памяти, вам не нужно подключаться к сети для повторной загрузки данных, но вы также не хотите сохранять две копии (NSData
и UIImage
) загруженными.