2016-01-31 4 views
0

Я изо всех сил пытался выяснить, почему мое приложение продолжает увеличиваться в памяти, когда я перемещаюсь по всему приложению.Имеет ли кэш-память iOS по умолчанию в памяти? (RAM)

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

Это заставляет меня думать, что iOS по умолчанию кэширует UIImage в память и освобождает память только в том случае, если устройство нуждается в ней.

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

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

EDIT: Также справедливо отметить, что я создаю изображение, используя конструктор UIImage(data: NSData).

+0

Когда вы сказали «оставить вид», как вы могли убедиться, что этот контроллер деинициализирован? Когда вы покидаете это представление, убедитесь, что весь массив и сильное свойство будут выпущены. iOS обрабатывает UI с помощью UIKit, а наиболее заметные компоненты сохраняются в памяти. UIKit имеет механизм поддержки автоматического выпуска компонентов, которые будут невидимыми, и освободить его из памяти и подготовиться к другому. –

ответ

2

iOS действительно кэширует много памяти. Основная поддержка для этого - в libcache, который UIKit использует внутренне, таким образом, который недоступен для вас.

Во время «давления памяти», то есть, когда ОЗУ низка, событие (технически, сообщение) передается всем слушателям. Ваше приложение прослушивает, потому что фреймворки автоматически открывают дескриптор файла kevent и реагируют на него с помощью известного didReceiveLowMemoryWarning. Помните, что в iOS нет подкачки (дисконтирование сжатой RAM для объема этого ответа), поэтому это происходит довольно часто.

Еще до didReceiveLowMemoryWarning передается вам, libcache использует таНос особенность «сброса давления зоны», которые вы можете увидеть для себя в:

... 
    /* Empty out caches in the face of memory pressure. The callback may be NULL. Present in version >= 
8. */ 
    size_t  (*pressure_relief)(struct _malloc_zone_t *zone, size_t goal); 
} malloc_zone_t; 

Таким образом, изображения (основные потребители памяти) будет при необходимости очищается, и поэтому вы должны быть очень обеспокоены. Тем не менее, если вы знаете, что вам больше не нужен данный объект интерфейса, вы можете, конечно, распорядиться им явно. Конечно, если у вас есть дополнительные ресурсы, которые нельзя автоматически очистить таким образом, вы должны обрабатывать их в делегате. Потому что, если вы этого не сделаете, Джетсам выбросит ваше приложение (т. Е. Убьет вас с непокрытым -9) и, вероятно, убьет нескольких невинных в вашей группе приоритетов.

Смежные вопросы