解决SDWebimage加载过多过大图片导致内存爆表崩溃的问题

时间:2024-03-23 20:22:22

问题:

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.

解决SDWebimage加载过多过大图片导致内存爆表崩溃的问题

原因:

collectionView一屏加载显示多个大图,导致内存消耗激增,程序被系统关闭。

(这里collectionView已经实现重用,高度以及view统一布局,主要内存问题在于图片的请求和加载处理过程)

  • 1、图片太大,服务器没有做相关压缩及缩略图处理
  • 2、SDWebimage同时加载过多过大高分辨率图片,内存消耗爆表。

解决方向:

  • 1、服务端处理图片,压缩以及做缩略图处理。(暂时没有)
  • 2、上传图片作压缩处理,在不损耗质量的前提下尽量压缩。(尽量去做,但是图片并非全部来自手机上传,而且也只是适当减轻一些负载,但并不能解决问题)
  • 3、解决SDWebimage加载高分辨率大图的问题。

iOS解决SDWebimage加载高分辨率大图crash的问题。

之前看到很多解决问题的方法,比如

[[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"];这个在这里没有什么效果,只是清除在加载图片开始的时候做清理,但是对于列表UITableview或者UICollectionView而言,瞬间发出N多个加载请求,主要负载其实还在请求之后。

不过这篇文章里提到了几种解决方法,虽然最后作者选择了当前方法,但是实际使用之后,效果并不好。

不过这篇文章提到的方法并没有实际验证,因为SDWebimage版本的问题,当前使用版本为pod 'SDWebImage', '~> 4.3.3'

  • 3、SDWebimage下载的options选项加入SDWebImageScaleDownLargeImages

对于少量的分辨率图片会有效果。但是对当前所要解决的大量(一屏显示30-40张)的高质量图片,依旧会因为内存激增而崩溃。

在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否则前面的设置并不会产生效果,导致崩溃。

这是一种极端的情况,一般加载大图,在手机上只需要一次加载少量的图片。如果是列表显示,一般会做图片的缩略处理。