Есть ли способ очистить кэш, используемый классом UIImage? - PullRequest
39 голосов
/ 13 мая 2011

Хорошо известно, что UIImage кэширует свои данные изображения, когда изображение загружается с использованием метода imageNamed:.

Из яблочной документации: https://developer.apple.com/documentation/uikit/uiimage/1624146-imagenamed

imageNamed:

Обсуждение : Этот метод выглядит в система кэширует для объекта изображения с указанное имя и возвращает, что объект, если он существует. Если соответствие объект изображения еще не находится в кеш, этот метод загружает изображение данные из указанного файла кеши это , а затем возвращает результат объект.

Из-за этого после загрузки нескольких изображений с помощью imageNamed: я заметил значительное увеличение использования памяти, а также то, что память поддерживалась даже после освобождения контроллера, который загружал изображения. (по крайней мере, он снова не увеличился, когда я выделил тот же контроллер)

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

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

Есть мысли о том, как этого добиться?

EDIT: После некоторых ответов я просто хочу прояснить, что существует огромный разрыв между необходимостью что-то делать и возможностью что-то делать. Как я уже говорил, я знаю, что операционная система заботится об этом кеше для меня, я просто пытаюсь увидеть ограничения, налагаемые iOS SDK.

Ответы [ 3 ]

7 голосов
/ 13 мая 2011

Я не знаю, как вручную очистить этот управляемый кеш iOS.В общем, это красная сельдь.Когда ОС управляет чем-то для вас, вам не нужно беспокоиться об этом.Пока вы правильно высвобождаете все, что вы распределяете / сохраняете, и обрабатываете предупреждения памяти надлежащим образом, вы делаете свое дело.

3 голосов
/ 25 апреля 2014

Ответ взят из Кевин Лоу комментарий


Если вы можете использовать частных API (как, например, в приложении AdHoc), используйте этот метод UIImage , чтобы удалить все изображения из кэша

[UIImage _flushSharedImageCache];
0 голосов
/ 13 мая 2011

Кэш будет очищен, когда это необходимо, т.е. когда приложение получит предупреждение о нехватке памяти.У вас нет причин делать это самостоятельно, и нет общедоступного API.

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