美文网首页首页推荐
SDWebImageDownloader 内存暴涨记录

SDWebImageDownloader 内存暴涨记录

作者: PetitBread | 来源:发表于2018-01-22 16:31 被阅读23次

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

    相关文章

      网友评论

        本文标题:SDWebImageDownloader 内存暴涨记录

        本文链接:https://www.haomeiwen.com/subject/hzzlaxtx.html