今天做一个图片展示列表,搭好界面,接好接口,渲染数据,run.........crash.
报的是内存泄漏的锅,看了下Memory,发现每次一进这个界面内存直接增到几百兆,然后crash。
这简直不能忍,用instrument跑一跑,看到如图
大部分内存都消耗在给图片分配了,明显是因为调用了
[SDWebImageDownloader sharedDownloader]downloadImageWithURL
SDWebImageDownloader点进去看到有这个属性
/**
* Decompressing images that are downloaded and cached can improve performance but can consume lot of memory.
* Defaults to YES. Set this to NO if you are experiencing a crash due to excessive memory consumption.
*/
@property (assign, nonatomic) BOOL shouldDecompressImages;
这个方法意思差不多就是 用于对图片进行解压缩并且缓存起来,以保证tableviews/collectionviews 交互更加流畅,默认的是YES,如果因为过量的内存导致crash,可以将这个属性设置为NO
仿佛看到了救星,设置完,run.......crash!!
WTF?貌似没用,内存一点不减。 貌似在6S,9.3系统以下禁止解压缩没有效果。
是不是缓存的原因,试试每次加载图片清空memcache。
[[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"];
依然没什么效果
那就在控制器dealloc的时候,执行
// 清空缓存(内存)
[[SDImageCache sharedImageCache] clearMemory];
// 清空已过期图片
[[SDImageCache sharedImageCache] cleanDisk];
// 清空磁盘图片
[[SDImageCache sharedImageCache] clearDisk];
还是没用
试着改一下 SDWebImageDownloaderOptions , 一开始用的 SDWebImageDownloaderProgressiveDownload ,改为 SDWebImageDownloaderIgnoreCachedResponse。
跑起来稳定在18M左右
这个就有点费解了,看一下
typedef NS_OPTIONS(NSUInteger, SDWebImageDownloaderOptions) {
//默认模式
SDWebImageDownloaderLowPriority = 1 << 0,
//本模式在返回进度Block的同时,同事返回completedBlock,里面的UIImage就是当前下载时的图片,可以实现将图片一点点显示出来的功能
SDWebImageDownloaderProgressiveDownload = 1 << 1,
//默认情况下,http请求阻止使用NSURLCache对象。如果设置了这个标记,则NSURLCache会被http请求使用。
SDWebImageDownloaderUseNSURLCache = 1 << 2,
//如果image/imageData是从NSURLCache返回的,则completion这个回调会返回nil
SDWebImageDownloaderIgnoreCachedResponse = 1 << 3,
//如果app进入后台模式,是否继续下载,这个是通过在后台申请时间来完成这个操作。如果指定的时间范围内没有完成,则直接取消下载。
SDWebImageDownloaderContinueInBackground = 1 << 4,
//处理缓存在`NSHTTPCookieStore`对象里面的cookie,通过设置`NSMutableURLRequest.HTTPShouldHandleCookies = YES`来实现的。
SDWebImageDownloaderHandleCookies = 1 << 5,
//允许非信任的SSL证书请求。在测试的时候很有用,但是正式环境要小心使用。
SDWebImageDownloaderAllowInvalidSSLCertificates = 1 << 6,
//默认情况下,图片加载的顺序是根据加入队列的顺序加载的。但是这个标记会把任务加入队列的最前面。
SDWebImageDownloaderHighPriority = 1 << 7,
//默认情况下,图片会按照它的原始大小来解码显示。这个属性会根据设备的内存限制调整图片的尺寸到合适的大小。如果`SDWebImageProgressiveDownload`标记被设置了,则这个flag不起作用。
SDWebImageDownloaderScaleDownLargeImages = 1 << 8,
};
就一个 Cache的区别,差别有点大,待我深入了解一下........
网友评论