Подтвердить что ты не робот

Есть ли способ очистить кеш, используемый классом UIImage?

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

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

imageNamed:

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

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

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

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

Любые мысли о том, как это сделать?

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

4b9b3361

Ответ 1

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


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

[UIImage _flushSharedImageCache];

Ответ 2

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

Ответ 3

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

Ответ 4

Возможно, у нас есть несколько методов удаления кэшированных изображений, но я думаю, что вы можете использовать self.cache.removeAllObjects(), который является одним из лучших методов, если вы используете объект Cache(). Если я ошибаюсь, каждый может поправить меня.