UIImageView не выпускает данные изображения должным образом?

В простейшей форме мое приложение отображает 10 UIImageView, каждый из которых содержит изображение. Даже со всеми UIImageView, содержащими изображения, мое приложение использует достаточно небольшой объем памяти. Однако есть кнопка для очистки всех UIImageView, установив для всех их изображений значение nil. Проблема в том, что при проверке монитора памяти в инструментах память, удерживаемая UIImageViews, НЕ уходит. Это не отображается в инструменте Allocations, подтверждая, что оставшийся объем памяти не является объектом, а памятью на основе графики. Если я изменяю размер изображений на что-то меньшее или большее, оставшаяся память также меньше или больше соответственно.

Почему данные изображения остаются после того, как для изображения UIImageView установлено значение nil?


person Riley Testut    schedule 14.01.2012    source источник


Ответы (2)


Я считаю, что UIKit хранит кеш изображений для повторного использования. UIImageView может освобождать объект, но его копия сохраняется из соображений производительности.

Однако эти изображения должны быть выпущены при получении предупреждения о памяти. Если это не так, я бы проверил два места:

  1. Убедитесь, что UIImageView освобождается. Используйте Инструмент распределения для профилирования вашего приложения и делайте все, что вам нужно сделать в программе, чтобы загрузить эти изображения. Затем выгрузите изображения и выполните поиск UIImageView. Пока вы уверены, что ваша программа должна была освободить их все, если вы найдете что-то в поиске, вы знаете, что что-то не так.
  2. Я бы также проверил все места, где был создан образ, например: UIImage = [UIImage imageName:@"Foo.jpg"]; Убедитесь, что они также выпускаются. Вы можете использовать выделения для поиска классов UIImage, но будет сложнее отсеять те, которые должны/не должны быть там.
  3. Запустите статический анализатор: в Xcode 4 он находится в разделе «Продукты» -> «Анализ». Это отличный инструмент для поиска логических ошибок, избыточного/недостаточного выпуска (если вы не используете ARC) и т. д.
person Aaron Hayman    schedule 14.01.2012
comment
Разве этот кеш теоретически не будет освобожден тогда, когда приложение получит предупреждение о памяти? Он сохраняется в моем приложении, несмотря на предупреждения. - person Riley Testut; 14.01.2012
comment
Да, я почти уверен, что где-то читал, что эти кеши очищаются при получении предупреждения о памяти, так что, похоже, есть проблема. Я обновлю свой ответ. - person Aaron Hayman; 15.01.2012

Пока сами UIImageView не будут освобождены, их память останется выделенной. Кроме того, если вы используете удобные методы в UIImage для получения изображений, например:

UIImage *myImage = [UIImage imageNamed:@"myImage"];

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

person isaac    schedule 14.01.2012
comment
Я создал свой собственный метод категории [UIImage loadImage:], чтобы дать мне лучший контроль над тем, что кешируется, а что нет, плюс я читаю эти изображения с диска, а не из набора приложений, поэтому imageNamed: cache не должен быть проблема. Кроме того, если я нахожусь в ARC, как лучше всего освободить эти объекты? Установка на ноль, похоже, не удаляет память. - person Riley Testut; 14.01.2012