SDWebImage大家肯定都恨熟悉了,国内外太多的App使用其进行图片加载。

但是最近在使用过程中发现,我用SDWebImage加载多个图片,类似微博动态那种,在加载的过程中。我发现当图片分辨率比较大的时候(不是图片大),加载几张图片就崩溃了。

网上说可以每次加载图片清空memcache,但是效果并不好。

 [[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"];

也有说把使用下面这个方法的地方全部注掉

+ (UIImage *)decodedImageWithImage:(UIImage *)image

但是效果并不明显。同时加载5-7张高分辨率图片还是会立即崩溃

我们使用SDWebimage肯定都会做三件事,一判断本地是否有这张图,二有的时候直接从本地取图片,三没有的时候去网络下载。

大概是像下面这样

 NSString *logoString = [_currentDic stringValueForKey:@"team_img"];if(logoString.length>0){[[SDImageCache sharedImageCache] queryDiskCacheForKey:logoString done:^(UIImage *image, SDImageCacheType cacheType) {if (image) {[_teamImage setImage:image];}else{[_teamImage sd_setImageWithURL:kNSUrl(logoString)placeholderImage:IMGNAMED(@"defaultAvatar2")options:SDWebImageRefreshCachedcompleted:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {if (image) {[[SDImageCache sharedImageCache] storeImage:image forKey:logoString toDisk:YES];}}];}}];}

在内部都会使用到下面这个方法

- (UIImage *)diskImageForKey:(NSString *)key {NSData *data = [self diskImageDataBySearchingAllPathsForKey:key];if (data) {UIImage *image = [UIImage sd_imageWithData:data];image = [self scaledImageForKey:key image:image];image = [UIImage decodedImageWithImage:image];return image;}else {return nil;}
}

我发现这里

 UIImage *image = [UIImage sd_imageWithData:data];

图片取出来的时候就已经巨大无比,占用了很大的内存,导致内存来不及释放就崩溃。

抽丝剥茧我们进入

sd_imageWithData方法

发现这里面对图片的处理是直接按照原大小进行的,如果几千是分辨率这里导致占用了大量内存。

所以我们需要在这里对图片做一次等比的压缩。

我们在

UIImage+MultiFormat这个类里面添加如下压缩方法,

+(UIImage *)compressImageWith:(UIImage *)image
{float imageWidth = image.size.width;float imageHeight = image.size.height;float width = 640;float height = image.size.height/(image.size.width/width);float widthScale = imageWidth /width;float heightScale = imageHeight /height;// 创建一个bitmap的context// 并把它设置成为当前正在使用的contextUIGraphicsBeginImageContext(CGSizeMake(width, height));if (widthScale > heightScale) {[image drawInRect:CGRectMake(0, 0, imageWidth /heightScale , height)];}else {[image drawInRect:CGRectMake(0, 0, width , imageHeight /widthScale)];}// 从当前context中创建一个改变大小后的图片UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();// 使当前的context出堆栈UIGraphicsEndImageContext();return newImage;}

再在上面箭头代码后面对图片进行压缩

#ifdef SD_WEBPelse if ([imageContentType isEqualToString:@"image/webp"]){image = [UIImage sd_imageWithWebPData:data];}
#endifelse {image = [[UIImage alloc] initWithData:data];if (data.length/1024 > 128) {image = [self compressImageWith:image];}UIImageOrientation orientation = [self sd_imageOrientationFromImageData:data];if (orientation != UIImageOrientationUp) {image = [UIImage imageWithCGImage:image.CGImagescale:image.scaleorientation:orientation];}

到了这里还需要进行最后一步。就是 在SDWebImageDownloaderOperation的connectionDidFinishLoading方法里面的:

UIImage *image = [UIImage sd_imageWithData:self.imageData];

//将等比压缩过的image在赋在转成data赋给self.imageData
NSData *data = UIImageJPEGRepresentation(image, 1);
self.imageData = [NSMutableData dataWithData:data];

再配合    [[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"];(图片加载后使用)大功告成,亲测内存基本变化不大,自动释放也来得及。

完美解决SDWebImage加载多个图片内存崩溃的问题相关推荐

  1. 使用SDWebImage加载多个图片内存崩溃的问题

    使用SDWebImage加载多个图片时,在加载的过程中,当图片分辨率比较大的时候,加载几张图片就崩溃了.需要对图片进行处理,避免内存崩溃问题. 一.预加载图片URL数组 预加载URL数组 [[SDWe ...

  2. 解决SDWebimage加载过多过大图片导致内存爆表崩溃的问题

    问题: Restore the connection to "xxxx" and run "xx" again, or if "xx" is ...

  3. 解决GitHub加载不出图片问题

    解决GitHub加载不出图片问题 参考文章: (1)解决GitHub加载不出图片问题 (2)https://www.cnblogs.com/jooy/p/12090882.html 备忘一下.

  4. 解决MWPhotoBrowser中的SDWebImage加载大图导致的内存警告问题

    本文转载至 http://www.superqq.com/blog/2015/01/22/jie-jue-mwphotobrowserzhong-de-sdwebimagejia-zai-da-tu- ...

  5. 小程序一次性上传多个本地图片,上拉加载照片以及图片加载延迟解决之道

    一:小程序之一次性上传多个本地相片 最近由于项目需要所以学了下小程序,也做了一些东西,随后便有了以下的一些总结了,现在说说如何使用小程序一次性上传多个本地相片. 问题描述 最近做项目的时候要实现一个上 ...

  6. Android手机内存图片读取,有效解决Android加载大图片内存溢出的问题

    今天在交流群里,有人问我他经常遇到加载图片时内存溢出的问题,遇到的情况还是在自己的测试机或者手机里没有问题,做好了, 到了客户手机里就内存溢出了.其实有时候不同的手机和不同的系统对内存的要求不一样,尤 ...

  7. 剖析Picasso加载压缩本地图片流程(解决Android 5.0部分机型无法加载本地图片的问题)

    之前项目中使用Picasso遇到了一个问题:在Android 5.0以上版本的部分手机上使用Picasso加载本地图片会失败.为了解决这个问题,研究了一下Picasso加载和压缩本地图片的流程,才有了 ...

  8. https访问http加载不出图片_前端解决第三方图片防盗链的办法

    作者:biaochenxuying 转发链接:https://github.com/biaochenxuying/blog/issues/31 问题 笔者网站的图片都是上传到第三方网站上的,比如 简书 ...

  9. 解决ImageLoader加载HTTPS图片证书校验异常问题

    解决ImageLoader加载HTTPS图片证书校验异常问题 参考文章: (1)解决ImageLoader加载HTTPS图片证书校验异常问题 (2)https://www.cnblogs.com/cs ...

最新文章

  1. python映射类型-python映射类型的相关介绍
  2. 压缩维度oj P1173+P1174+P1164
  3. 【流量劫持】躲避 HSTS 的 HTTPS 劫持
  4. OpenGL使用链表进行顺序独立的透明度
  5. QT中VideoProbe的简介和实现
  6. python做var模型_【Python金融量化】VaR系列(五):Copula模型估计组合VaR-阿里云开发者社区...
  7. 道路建立拓扑关系的规则_建立真正社区关系的5条规则
  8. (63)FPGA二维数组(reg)
  9. 发布了!2020 年 AI 人才发展报告,最高补助 1000 万!
  10. 海思3519A上运行yolov3(二)——Linux和Windows开发环境和运行环境搭建
  11. 干货 | 语音识别类产品细分及其应用场景
  12. 多目标数据关联基本方法
  13. 【毕设狗】【单片机毕业设计】基于单片机的智能垃圾桶设计-实物设计
  14. zktime 协议_zktime5.0考勤管理系统使用说明书(1.0版).pdf
  15. JavaScript菜鸟教程笔记
  16. 怎么样把 swf格式 转换为flv格式
  17. 图像坐标球面投影_C/C++ 图像处理(7)------图像の球面投影算法
  18. java发布帖子_第一篇发在javaeye的帖子
  19. html水平分割线虚线代码,CSS分割线虚线代码
  20. python生成图像公章_仿真印章制作——三种方法

热门文章

  1. Spring WebFlux快速上手——响应式Spring的道法术器
  2. Ambassador让K8s更容易、更快地访问网络
  3. R语言 mice包 Error in terms.formula(tmp, simplify = TRUE) : ExtractVars里的模型公式不对
  4. ThinkPHP 初探
  5. 数据仓库分层作用及作用
  6. 17届智能车图像处理部分讲解
  7. 百度地图技术赋能智能硬件 推动行业安全、智能化发展
  8. Linux 基础篇(06)Linux 系统管理员
  9. oracle位图索引语句,oracle之位图索引
  10. 微信开发之移动手机WEB页面(HTML5)Javascript实现一键拨号及短信发送