众所周知,使用 +[UIImage imageNamed:] 方法加载图片是会进图片缓存的,清除缓存是系统触发,并没有为我们提供API;使用 +[UIImage imageWithContentsOfFile:] 方法加载图片是不会进入图片缓存的。如果想要有图片缓存机制,并且能手动清除图片缓存,我们可以这样做:

+[UIImage imageWithContentsOfFile:] 方向下手: 我们可以自己维护一套图片缓存,Swizzle +[UIImage imageWithContentsOfFile:] 方法加入缓存机制。加载图片后,加入到 NSCache 缓存,再次取该图片时,优先取 NSCache 内的缓存,如果缓存内没有再去真正加载。NSCacheMemory Warning 的时候会自动清除缓存,我们也可以使用 -[NSCache removeAllObjects] 手动清除缓存。当然,你也可以不使用 Swizzle ,写一个 Manager 也是可以的,我只是提供一种思路。

+[UIImage imageNamed:] 方向下手: 在 Memory Warning 或进入后台时,系统会自动帮我们清除使用 +[UIImage imageNamed:] 的图片缓存。我们也可以通过模拟发送 UIApplicationDidReceiveMemoryWarningNotificationUIApplicationDidEnterBackgroundNotification 来清除图片缓存,风险可以根据实际情况来评估。

还可以从私有API来下手,+[UIImage imageNamed:] 系统底层是通过 UIAssetManager 来管理图片缓存的,如下两图所示,我们可以模拟调用 _clearCachedResources 方法来实现清除缓存。

如果有其他思路的,欢迎提出!