iOS SDWebImage加载大图导致程序闪退

在SDImageCache.m中找到diskImageForKey方法,发现SDWebImage每次加载网络图片都会进行解码,并将图片存到cache使得之后的加载更加快,效果更加好。但是问题就在于去解码这个操作,如果传进的图片分辨率特别的高,它的解码会消耗大量的内存,所以当图片过大时不进行解码操作。

- (nullable UIImage *)diskImageForKey:(nullable NSString *)key {
    NSData *data = [self diskImageDataBySearchingAllPathsForKey:key];
    if (data) {
        UIImage *image = [UIImage sd_imageWithData:data];
        image = [self scaledImageForKey:key image:image];
        //当图片过大时(大于5M)不解码
        if (data.length > 5*1024*1024) {
            return image;
        }else{
            if (self.config.shouldDecompressImages) {
                image = [UIImage decodedImageWithImage:image];
            }
            return image;
        }
        
        
    }
    else {
        return nil;
    }
}

一般我们都是使用:

+ (nullable UIImage *)imageNamed:(NSString *)name;      // load from main bundle

+ (nullable UIImage *)imageWithContentsOfFile:(NSString *)path;

两种方式加载图片

为什么要对图片进行解码?难道不能直接使用上面的两种加载方式直接进行加载显示吗,答案是可以,而且大概我们编码都是使用上面的两种方式直接在主线程加载图片然后显示在UIImageView上,并且并没有发现什么问题。那为什么SDWebImage 还要费劲去进行解码图片呢,其实我们自己不解码图片我们也是可以直接使用的(其实是系统为我们进行了解码的操作),一般下载的图片或者我们手动拖进主bundle 的图片都是PNG 或者JPG 其他格式的图片,这些图片都是经过编码压缩后的图片数据,并不是控件可以直接显示的位图,如果我们直接使用 "+ (nullable UIImage *)imageNamed:(NSString *)name" 来加载图片,系统默认会在主线程立即进行图片的解码工作,这个过程就是把图片数据解码成可供控件直接显示的位图数据,由于这个解码操作比较耗时,并且默认是在主线程进行,所以当在主线程调用了大量的 "+ (nullable UIImage *)imageNamed:(NSString *)name" 方法后就会产生卡顿。(同时由于位图体积较大,所以在磁盘缓存中不会直接缓存位图数据,而是编码压缩过的PNG 或者JPG 数据)

你可能感兴趣的:(iOS SDWebImage加载大图导致程序闪退)