2010-05-06 2 views
0

Мой UIButton имеет это фоновое изображение устанавливается следующим образом:UIButton setBackgroundImage потребляет не освобождает память?

[myImageButton setBackgroundImage:[UIImage imageNamed:myImageName] forState:UIControlStateNormal]; 

myImageButton является сохранить свойство класса, и установка с IB. Нет, где еще он доступен в приложении.

myImageName это просто NSString с именем файла, как @ "myImage_number_1.png"

Я загрузки больших изображений, 1024 х 1024 в размере. Когда изображение отображается, оно меняет изображение с помощью вышеуказанного оператора, затем уменьшается доступная память.

После того, как я вижу вид примерно 7-9 раз, приложение выходит из строя с предупреждением о памяти.

Я думал, что метод высвободит загруженное изображение.

Вид сам только создается и выделяется только один раз, поэтому он не находится в цикле сохранения/освобождения, если контроллер вида.

Есть что-то об этом setBackgroundImage Я не знаю, что заставляет его не выпускать память?

ответ

4

А, нашел. Каждый раз, когда imageNamed используется для загрузки изображения, он кэширует изображение в памяти. Я переключился на imageWithContentsOfFile - он не кэширует изображения.

0

К будущим кодам, ответ @just_another_coder правильный, но вы должны все знать.

[UIImage imageNamed: myImageName] загружает изображение в специальный системный кеш, а затем будущие вызовы с этим путем будут возвращать изображение в кеш, а не перезагружать его с диска.

[UIImage imageWithContentsOfFile] просто загружает изображение по указанному вами пути, но не кэширует. Несколько вызовов в imageWithContentsOfFile для одного и того же изображения приведут к нескольким копиям в памяти.

Таким образом, вы должны думать о том, какой вы бы скорее, и если вы используете imagewithcontentsoffile вы должны помнить, всухую из этой кнопки в противном случае вы будете обречены на постоянно растущее приложение (использование памяти мудрым)

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