内容字号:默认大号超大号

段落设置:段首缩进取消段首缩进

字体设置:切换到微软雅黑切换到宋体

记录:SDWebImageDownloader内存溢出

2018-05-15 16:50 出处:清屏网 人气: 评论(0

今天做一个图片展示列表,搭好界面,接好接口,渲染数据,run………crash.

报的是内存泄漏的锅,看了下Memory,发现每次一进这个界面内存直接增到几百兆,然后crash。

这简直不能忍,用instrument跑一跑,看到如图

大部分内存都消耗在给图片分配了,明显是因为调用了

[SDWebImageDownloader sharedDownloader]downloadImageWithURL

SDWebImageDownloader点进去看到有这个属性

/**
 * Decompressing images that are downloaded and cached can improve performance but can consume lot of memory.
 * Defaults to YES. Set this to NO if you are experiencing a crash due to excessive memory consumption.
 */
@property (assign, nonatomic) BOOL shouldDecompressImages;

这个方法意思差不多就是 用于对图片进行解压缩并且缓存起来,以保证tableviews/collectionviews 交互更加流畅,默认的是YES,如果因为过量的内存导致crash,可以将这个属性设置为NO

仿佛看到了救星,设置完,run…….crash!!

WTF?貌似没用,内存一点不减。 貌似在6S,9.3系统以下禁止解压缩没有效果。

是不是缓存的原因,试试每次加载图片清空memcache。

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

依然没什么效果

那就在控制器dealloc的时候,执行

// 清空缓存(内存)
    [[SDImageCache sharedImageCache] clearMemory];
    // 清空已过期图片
    [[SDImageCache sharedImageCache] cleanDisk];
    // 清空磁盘图片
    [[SDImageCache sharedImageCache] clearDisk];

还是没用

试着改一下 SDWebImageDownloaderOptions , 一开始用的 SDWebImageDownloaderProgressiveDownload ,改为 SDWebImageDownloaderIgnoreCachedResponse。

跑起来

稳定在18M左右

这个就有点费解了,看一下

typedef NS_OPTIONS(NSUInteger, SDWebImageDownloaderOptions) {
    //默认模式
    SDWebImageDownloaderLowPriority = 1 << 0,
    //本模式在返回进度Block的同时,同事返回completedBlock,里面的UIImage就是当前下载时的图片,可以实现将图片一点点显示出来的功能
    SDWebImageDownloaderProgressiveDownload = 1 << 1,
    //默认情况下,http请求阻止使用NSURLCache对象。如果设置了这个标记,则NSURLCache会被http请求使用。
    SDWebImageDownloaderUseNSURLCache = 1 << 2,
    //如果image/imageData是从NSURLCache返回的,则completion这个回调会返回nil
    SDWebImageDownloaderIgnoreCachedResponse = 1 << 3,
    //如果app进入后台模式,是否继续下载,这个是通过在后台申请时间来完成这个操作。如果指定的时间范围内没有完成,则直接取消下载。
    SDWebImageDownloaderContinueInBackground = 1 << 4,
    //处理缓存在`NSHTTPCookieStore`对象里面的cookie,通过设置`NSMutableURLRequest.HTTPShouldHandleCookies = YES`来实现的。
    SDWebImageDownloaderHandleCookies = 1 << 5,
    //允许非信任的SSL证书请求。在测试的时候很有用,但是正式环境要小心使用。
    SDWebImageDownloaderAllowInvalidSSLCertificates = 1 << 6,
    //默认情况下,图片加载的顺序是根据加入队列的顺序加载的。但是这个标记会把任务加入队列的最前面。
    SDWebImageDownloaderHighPriority = 1 << 7,
    //默认情况下,图片会按照它的原始大小来解码显示。这个属性会根据设备的内存限制调整图片的尺寸到合适的大小。如果`SDWebImageProgressiveDownload`标记被设置了,则这个flag不起作用。
    SDWebImageDownloaderScaleDownLargeImages = 1 << 8,
};

就一个 Cache的区别,差别有点大,待我深入了解一下


分享给小伙伴们:
本文标签: SDWebImageDo内存溢出

相关文章

发表评论愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。

CopyRight © 2015-2016 QingPingShan.com , All Rights Reserved.

清屏网 版权所有 豫ICP备15026204号