加载大量图片内存暴增导致闪退 Terminated due to memory issue(内存暴增SDWebImage加载高清大图崩溃)

上传图片一定要压缩,一定要压缩,一定要压缩。(目前手机拍摄的图片一张几M,上传后不压缩,如果几十张一块加载展示时内存画面有点美!如果是后台上传除了需要高清以外的图也需要压缩处理)

下载大量图片时一定要注意内存问题。

Terminated due to memory issue  内存问题有很多种。一起加载大图只是其中之一(内存泄漏,大量计算,大量存储等等)。

加载大量图片内存暴增导致闪退 Terminated due to memory issue(内存暴增SDWebImage加载高清大图崩溃)_第1张图片

Test 计算导致内存爆增:

autoreleasepool 的使用 (没添加有明显的峰值,添加后平缓)

加载大量图片内存暴增导致闪退 Terminated due to memory issue(内存暴增SDWebImage加载高清大图崩溃)_第2张图片

 

加载大量图片内存暴增导致闪退 Terminated due to memory issue(内存暴增SDWebImage加载高清大图崩溃)_第3张图片

在大量循环计算时可以使用 autoreleasepool 

//内存爆增
-(void)test{
    NSInteger sum = 0;
    for(int i = 0;i < 1000000000;i++){
            sum = sum+i;
            NSLog(@"=====%ld",sum);
    }
     NSLog(@"--%ld",(long)sum);
  
}

//内存平缓
-(void)test2{
    NSInteger sum = 0;
    for(int i = 0;i < 1000000000;i++){
        @autoreleasepool {
            sum = sum+i;
            NSLog(@"=====%ld",sum);
        }
    }
     NSLog(@"--%ld",(long)sum);
  
}

加载N多张高清大图直接快爆掉(看内存简直是丧心病狂啊):

 

加载大量图片内存暴增导致闪退 Terminated due to memory issue(内存暴增SDWebImage加载高清大图崩溃)_第4张图片

 

//清除SDWebImage缓存

[[SDImageCache sharedImageCache] clearDiskOnCompletion:nil];
 [[SDImageCache sharedImageCache] clearMemory];

//获取图片缓存大小

-(void)total{
    [[SDImageCache sharedImageCache]calculateSizeWithCompletionBlock:^(NSUInteger fileCount, NSUInteger totalSize) {
          NSLog(@"==AA=====%lu",(unsigned long)totalSize);
       }];
}

如何破呢?

tip:如果图片存在阿里云或者其他服务器上查看一下是否有下载非高清图的方式

1 控制每次加载的数量,通过页数或者上拉加载等方式;(同时加载100张图和5次加载100张图完全不同)

2  上传时除了需要特别高清以外的图适当压缩;(如果web端上传,非所需高清图最好也适当压缩,控制大小)

3  缩略图模式。先展示一张缩略非高清图,点击再展示大图;

4  下载时注意主要还是压缩图大小,在不降画质的情况可以降低图片的大小,减少内存消耗,及时清除缓存或者不缓存。

5  设置缓存策略,修改一些SDWebImage的参数;

6 如果是单张高清大图可以将图分开切片上传下载后拼合;

阿里云OSS 的图片处理服务图片大小限制

阿里云图片通过参数设置可以 控制图片下载的大小和画质 从而减小图片大小
先来看下图片路径即完整参数:
1
https://OSS地址/图片名称.后缀?x-oss-process=image/resize,limit_0,m_fill,w_200,h_200/quality,q_100
一、参数:?x-oss-process=image/resize,limit_0,m_fill,w_200,h_200/quality,q_100

queryString : x-oss-process=image/quality,q_{int} 这个就是更改图片清晰度的结尾参数 {int}取值0~100

通过参数加在 url 后面

?x-oss-process=image/resize,m_fill,w_300,h_300
参数加 style 名

?x-oss-process=style/panda_style
通过分隔符访问

bucket.aliyuncs.com/sample.jpg{分隔符}stylename
图片服务都是使用标准的HTTP的GET请求来访问的,所有的处理参数也在URL的QueryString中。此时不能开启原图保护。

直接传入参数就能访问:image/resize,w_200/rotate,90

高级切割-索引切割
image/indexcrop,x_100,i_0

图片格式转换:

image/format,jpg

阿里文档: https://help.aliyun.com/document_detail/44705.html?spm=a2c4g.11186623.6.1429.c16f2e93LTt8i9

解决办法无非就那么几种,当然也可能有其他方法想到再补充吧,参考下面几篇博客(为了少点重复内容,我就懒得抄了):

图片大小以及清晰度影响 : https://www.jianshu.com/p/ea475f608526

解决方案根据不同版本的SDWebImage也不同:

老版本修改源码:

https://blog.csdn.net/benyoulai5/article/details/50462586?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

加载高清大图崩溃问题 https://www.cnblogs.com/oc-bowen/p/9040476.html

SDWebImage 加载显示 GIF 与性能问题:http://www.cnblogs.com/silence-cnblogs/p/6682867.html

SDWebImage加载高清大图崩溃问题:https://www.cnblogs.com/oc-bowen/p/9040476.html

新版本:

iOS SDWebImage加载大图导致内存崩溃修改缓存配置解决方案  https://www.cnblogs.com/qqcc1388/p/9436561.html

 

解决SDWebimage加载过多过大图片导致内存爆表崩溃的问题 https://blog.csdn.net/fengzhixinfei/article/details/87912102

 

 

你可能感兴趣的:(iOS开发)