ios 进阶 -- 图片内存管理
最近在做优化程序的性能方面的工作,涉及到了图片内存管理方面,所以这方面的内容总结一下,
1,为什么做图片内存管理?
问题a,程序启动后,浏览图片时, 内存一直增长。
问题b, 浏览图片时,程序UI显示不流畅,即使本地的图处,也不流畅。
2,怎么做图片内存管理?
对应用程序域内的图片内存进行管理, 当程序的多个地方需要 引用一个图片时,都指向同一个图片的内存地址。
3,如何做?
如果是本地资源时的图片,地址固定,不存在过期问题 我们可以直接 使用系统 [UIImage ImageName:] 方法。 这个方法本身就做了,内存缓存。
多个地方 调用同个图片地址时,它返回的都是同一个内存地址。
如果是网络图片的话, 我们可以将 网络请求下来的图片放在缓存里,下次再访问时,先检查此图片是否在缓存里,如果在,则直接返回图片,如果没有,则检查则重新请求。
大至的做法 是,将请求的URL 与图片放在 字典里, url 做key, 图片内容 做value ,如果 下次再使用图片时,先检查url 的key 时否已经存在就可以了。
当然我们只是说了大概的原理,忽略许多细节,如图片内存大小管理,图片文件缓存管理,图片同步/异步加载, 图片内存清理时,不同的图片的清理策略 等等, 诸多问题。
当然,开源图片内存管理项目比较多,对以上的问题,解决的也比较 好, 以下是我推荐的自己常用的库
a, SGImageCache https://github.com/seatgeek/SGImageCache
[SGImageCache getImageForURL:url thenDo:^(UIImage *image) { if (image) { self.imageView.image = image; }}];
b, SDWebImageManager
SDWebImageManager *manager = [SDWebImageManager sharedManager]; UIImage *cachedImage = [manager imageWithURL:url]; if (cachedImage) { // Use the cached image immediatly } else { // Start an async download [manager downloadWithURL:url delegate:self]; }
(SDWebImageManager *)imageManager didFinishWithImage:(UIImage *)image { // Do something with the downloaded image }</code>
转载请标明出处 http://blog.csdn.net/sea918 谢谢。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。