SDWebImage下载大尺寸图片内存暴增,APP崩溃的解决办法
解决办法
SDWebImageDownloaderOptions 设置为 SDWebImageDownloaderAvoidDecodeImage | SDWebImageDownloaderScaleDownLargeImages | SDWebImageDownloaderHighPriority
[[SDWebImageDownloader sharedDownloader] downloadImageWithURL:url options:SDWebImageDownloaderAvoidDecodeImage | SDWebImageDownloaderScaleDownLargeImages | SDWebImageDownloaderHighPriority progress:^(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL) {
} completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished) {
}];
压缩后的图,原图尺寸25896 * 12234
这是一张尺寸超级大的产品原型图,尺寸是25896 * 12234 ,大小为8.1M,用我的Mac电脑打开都会稍微有点卡顿。一天产品把图发送给其他同事,同事下载点击查看原图,可想而知APP就挂掉了!
正常情况下APP的消耗的内存也就是150M左右,当看这张原图的话,内存直接飙升到1.4G。内存小的手机,iPhone8以下的手机直接就崩溃了。
下载原图前 下载原图后于是就开始查找原因,并解决问题......
最后,在下面2篇文章中找到了解决办法(我们项目中SDWebImage用的是5.6版本)
使用SDWebImage下载高分辨率图,导致内存暴增的解决办法
参考文章
但是,我设置SDWebImageDownloaderOptions 为SDWebImageDownloaderAvoidDecodeImage 却不奏效,经过我多次尝试把SDWebImageDownloaderOptions 设置为 SDWebImageDownloaderAvoidDecodeImage | SDWebImageDownloaderScaleDownLargeImages后达到了想要的效果
- SDWebImageDownloaderAvoidDecodeImage
对于高分辨率的图片,应该在图片解压缩后,禁止缓存解压缩后的数据
解压缩操作中,每一个像素点都会分配一个空间来存储相关值,那么分辨率越高,图片尺寸越大,就意味着更多数量的像素点,也就意味着需要分配更多的空间!所以对于高分辨率图来说,如果缓存解压缩之后的数据,即使是几M的图片,也是有可能消耗上G的内存
- SDWebImageDownloaderScaleDownLargeImages
设置为 AvoidDecodeImage | ScaleDownLargeImages 后下载原图默认情况下,图片会按照他的原始大小来解码显示。这个属性会调整图片的尺寸到合适的大小根据设备的内存限制
为什么分别设置SDWebImageDownloaderAvoidDecodeImage、SDWebImageDownloaderScaleDownLargeImages没有效果,而设置SDWebImageDownloaderAvoidDecodeImage | SDWebImageDownloaderScaleDownLargeImages后能达到效果,我也不是很清楚。如果哪位大神知道或者有更好的办法还望不吝赐教!
参考资料
SDWebImage设置大尺寸图片崩溃问题
iOS图片加载到内存中占用内存情况
iOS 如何计算图片加载内存中所占的大小
参考文章