UIImageView не выпускает данные изображения должным образом? - PullRequest
0 голосов
/ 14 января 2012

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

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

Ответы [ 2 ]

1 голос
/ 14 января 2012

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

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

  1. Убедитесь, что UIImageView освобождается.Используйте Allocations Instrument для профилирования вашего приложения и делайте все, что вам нужно сделать в программе для загрузки этих изображений.Затем выгрузите изображения и выполните поиск UIImageView.Если вы уверены, что ваша программа должна была выпустить их все, если вы обнаружите что-либо в поиске, вы знаете, что что-то не так.
  2. Я также проверил бы все места, где было создано изображение, например:UIImage = [UIImage imageName:@"Foo.jpg"]; Убедитесь, что они также выпускаются.Вы можете использовать выделения для поиска классов UIImage, но будет сложнее отсеять те, которые должны / не должны быть там.
  3. Запустите статический анализатор: в Xcode 4 он находится в разделе Продукты -> Анализ.Это отличный инструмент для поиска логических ошибок, чрезмерного или недостаточного выпуска (если вы не используете ARC) и т. Д.
0 голосов
/ 14 января 2012

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

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

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

...