解决SDWebimage加载过多过大图片导致内存爆表崩溃的问题
問題:
Restore the connection to “xxxx” and run “xx” again, or if “xx” is still running, you can attach to it by selecting Debug > Attach to Process > xx.原因:
collectionView一屏加載顯示多個(gè)大圖,導(dǎo)致內(nèi)存消耗激增,程序被系統(tǒng)關(guān)閉。
(這里collectionView已經(jīng)實(shí)現(xiàn)重用,高度以及view統(tǒng)一布局,主要內(nèi)存問題在于圖片的請(qǐng)求和加載處理過程)
- 1、圖片太大,服務(wù)器沒有做相關(guān)壓縮及縮略圖處理
- 2、SDWebimage同時(shí)加載過多過大高分辨率圖片,內(nèi)存消耗爆表。
解決方向:
- 1、服務(wù)端處理圖片,壓縮以及做縮略圖處理。(暫時(shí)沒有)
- 2、上傳圖片作壓縮處理,在不損耗質(zhì)量的前提下盡量壓縮。(盡量去做,但是圖片并非全部來自手機(jī)上傳,而且也只是適當(dāng)減輕一些負(fù)載,但并不能解決問題)
- 3、解決SDWebimage加載高分辨率大圖的問題。
iOS解決SDWebimage加載高分辨率大圖crash的問題。
之前看到很多解決問題的方法,比如
- 1、每次加載圖片清空內(nèi)存的緩存
[[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"];這個(gè)在這里沒有什么效果,只是清除在加載圖片開始的時(shí)候做清理,但是對(duì)于列表UITableview或者UICollectionView而言,瞬間發(fā)出N多個(gè)加載請(qǐng)求,主要負(fù)載其實(shí)還在請(qǐng)求之后。
不過這篇文章里提到了幾種解決方法,雖然最后作者選擇了當(dāng)前方法,但是實(shí)際使用之后,效果并不好。
- 2、修改SDWebimage源生圖片處理方法
不過這篇文章提到的方法并沒有實(shí)際驗(yàn)證,因?yàn)镾DWebimage版本的問題,當(dāng)前使用版本為pod 'SDWebImage', '~> 4.3.3'。
- 3、SDWebimage下載的options選項(xiàng)加入SDWebImageScaleDownLargeImages
對(duì)于少量的分辨率圖片會(huì)有效果。但是對(duì)當(dāng)前所要解決的大量(一屏顯示30-40張)的高質(zhì)量圖片,依舊會(huì)因?yàn)閮?nèi)存激增而崩潰。
- 4、配置SDWebimage參數(shù),解決問題。
在APPDelegate中設(shè)置相關(guān)參數(shù)。
- (void)imageLoadingSettings {[SDImageCache sharedImageCache].config.maxCacheAge = 3600 * 24 * 7;[SDImageCache sharedImageCache].maxMemoryCost = 1024 * 1024 * 20;[SDImageCache sharedImageCache].config.shouldCacheImagesInMemory = NO;[SDImageCache sharedImageCache].config.shouldDecompressImages = NO;[SDWebImageDownloader sharedDownloader].shouldDecompressImages = NO;[SDImageCache sharedImageCache].config.diskCacheReadingOptions = NSDataReadingMappedIfSafe; }其次在加載方法的options中設(shè)置SDWebImageScaleDownLargeImages
[_billImageView sd_setImageWithURL:url placeholderImage:image options:SDWebImageRetryFailed|SDWebImageScaleDownLargeImages|SDWebImageRefreshCached];[[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"]; // tableView/collectionView加載更多的時(shí)候,會(huì)有一定的效果。這里的options一定不能設(shè)置SDWebImageProgressiveDownload否則前面的設(shè)置并不會(huì)產(chǎn)生效果,導(dǎo)致崩潰。
這是一種極端的情況,一般加載大圖,在手機(jī)上只需要一次加載少量的圖片。如果是列表顯示,一般會(huì)做圖片的縮略處理。
總結(jié)
以上是生活随笔為你收集整理的解决SDWebimage加载过多过大图片导致内存爆表崩溃的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【阿里云部署网站——零基础七步上云】
- 下一篇: 从1亿个数里面找出前100个最大的