问题:
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的问题。
之前看到很多解决问题的方法,比如
[[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
否则前面的设置并不会产生效果,导致崩溃。
这是一种极端的情况,一般加载大图,在手机上只需要一次加载少量的图片。如果是列表显示,一般会做图片的缩略处理。