Ответ 1
Ответ от Кевин Лоу комментарий
Если вы можете использовать частные API (например, в приложении AdHoc, например), используйте этот UIImage
метод, чтобы удалить все изображения из кеша
[UIImage _flushSharedImageCache];
Хорошо известно, что 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.
Ответ от Кевин Лоу комментарий
Если вы можете использовать частные API (например, в приложении AdHoc, например), используйте этот UIImage
метод, чтобы удалить все изображения из кеша
[UIImage _flushSharedImageCache];
Я не знаю, как вручную очистить этот кеш-память iOS. В общем, это красная селедка. Когда os что-то управляет, вам не нужно беспокоиться об этом. До тех пор, пока вы правильно выпускаете что-либо, что вы соответствующим образом выделяете/сохраняете и обрабатываете предупреждения о памяти, вы делаете свою часть.
Кэш будет опустошен, когда это необходимо, т.е. когда приложение получает предупреждение о низкой памяти. У вас нет оснований для этого, и нет общедоступного API.
Возможно, у нас есть несколько методов удаления кэшированных изображений, но я думаю, что вы можете использовать self.cache.removeAllObjects()
, который является одним из лучших методов, если вы используете объект Cache(). Если я ошибаюсь, каждый может поправить меня.