对清除图片缓存的思考
众所周知,使用 +[UIImage imageNamed:]
方法加载图片是会进图片缓存的,清除缓存是系统触发,并没有为我们提供API;使用 +[UIImage imageWithContentsOfFile:]
方法加载图片是不会进入图片缓存的。如果想要有图片缓存机制,并且能手动清除图片缓存,我们可以这样做:
从 +[UIImage imageWithContentsOfFile:]
方向下手:
我们可以自己维护一套图片缓存,Swizzle +[UIImage imageWithContentsOfFile:]
方法加入缓存机制。加载图片后,加入到 NSCache
缓存,再次取该图片时,优先取 NSCache
内的缓存,如果缓存内没有再去真正加载。NSCache
在 Memory Warning
的时候会自动清除缓存,我们也可以使用 -[NSCache removeAllObjects]
手动清除缓存。当然,你也可以不使用 Swizzle
,写一个 Manager
也是可以的,我只是提供一种思路。
从 +[UIImage imageNamed:]
方向下手:
在 Memory Warning
或进入后台时,系统会自动帮我们清除使用 +[UIImage imageNamed:]
的图片缓存。我们也可以通过模拟发送 UIApplicationDidReceiveMemoryWarningNotification
或 UIApplicationDidEnterBackgroundNotification
来清除图片缓存,风险可以根据实际情况来评估。
还可以从私有API来下手,+[UIImage imageNamed:]
系统底层是通过 UIAssetManager
来管理图片缓存的,如下两图所示,我们可以模拟调用 _clearCachedResources
方法来实现清除缓存。
如果有其他思路的,欢迎提出!