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 數據)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容