首页推荐

SDWebImageDownloader 内存暴涨记录

2018-01-22  本文已影响23人  PetitBread

今天做一个图片展示列表,搭好界面,接好接口,渲染数据,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的区别,差别有点大,待我深入了解一下........

上一篇下一篇

猜你喜欢

热点阅读