UIButton setBackgroundImage потребляет не освобождает память? - PullRequest
0 голосов
/ 06 мая 2010

У моего UIButton фоновое изображение установлено так:

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

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

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

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

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

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

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

Есть ли что-то в этом setBackgroundImage, которого я не знаю, что заставляет его не освобождать память?

Ответы [ 2 ]

4 голосов
/ 06 мая 2010

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

0 голосов
/ 17 октября 2017

Для будущих кодеров ответ @just_another_coder верен, но есть кое-что, что вы все должны знать.

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...