解决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一屏加載顯示多個大圖,導致內存消耗激增,程序被系統關閉。
(這里collectionView已經實現重用,高度以及view統一布局,主要內存問題在于圖片的請求和加載處理過程)
- 1、圖片太大,服務器沒有做相關壓縮及縮略圖處理
- 2、SDWebimage同時加載過多過大高分辨率圖片,內存消耗爆表。
解決方向:
- 1、服務端處理圖片,壓縮以及做縮略圖處理。(暫時沒有)
- 2、上傳圖片作壓縮處理,在不損耗質量的前提下盡量壓縮。(盡量去做,但是圖片并非全部來自手機上傳,而且也只是適當減輕一些負載,但并不能解決問題)
- 3、解決SDWebimage加載高分辨率大圖的問題。
iOS解決SDWebimage加載高分辨率大圖crash的問題。
之前看到很多解決問題的方法,比如
- 1、每次加載圖片清空內存的緩存
[[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"];這個在這里沒有什么效果,只是清除在加載圖片開始的時候做清理,但是對于列表UITableview或者UICollectionView而言,瞬間發出N多個加載請求,主要負載其實還在請求之后。
不過這篇文章里提到了幾種解決方法,雖然最后作者選擇了當前方法,但是實際使用之后,效果并不好。
- 2、修改SDWebimage源生圖片處理方法
不過這篇文章提到的方法并沒有實際驗證,因為SDWebimage版本的問題,當前使用版本為pod 'SDWebImage', '~> 4.3.3'。
- 3、SDWebimage下載的options選項加入SDWebImageScaleDownLargeImages
對于少量的分辨率圖片會有效果。但是對當前所要解決的大量(一屏顯示30-40張)的高質量圖片,依舊會因為內存激增而崩潰。
- 4、配置SDWebimage參數,解決問題。
在APPDelegate中設置相關參數。
- (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中設置SDWebImageScaleDownLargeImages
[_billImageView sd_setImageWithURL:url placeholderImage:image options:SDWebImageRetryFailed|SDWebImageScaleDownLargeImages|SDWebImageRefreshCached];[[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"]; // tableView/collectionView加載更多的時候,會有一定的效果。這里的options一定不能設置SDWebImageProgressiveDownload否則前面的設置并不會產生效果,導致崩潰。
這是一種極端的情況,一般加載大圖,在手機上只需要一次加載少量的圖片。如果是列表顯示,一般會做圖片的縮略處理。
總結
以上是生活随笔為你收集整理的解决SDWebimage加载过多过大图片导致内存爆表崩溃的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【阿里云部署网站——零基础七步上云】
- 下一篇: 从1亿个数里面找出前100个最大的