设置SDWebImage中maxCacheSize动态管理图片内存缓存大小无效。maxCacheSize和maxMemoryCost的定义和使用。

在按照之前我的那片博文介绍的方法修复了强引用造成的SDWebImage无法释放自己的图片缓存后,虽然它已经可以在收到内存警报时清除内存的缓存,但是却仍然会偶尔遇到闪退。自己猜测可能是因为在收到内存警报时正在下载的图片大小的比较大,导致内存警报没来得及处理,内存就被撑爆了。所以考虑使用maxMemoryCost或者maxCacheSize来控制内存cache的大小。在不设置maxMemoryCost,而只设置了maxCacheSize的时候,leaks中看到内存使用量还是在持续增加的。并没有达到预期效果

在阅读官方文档和各种网上文章发现对于maxCacheSize的具体定义还是先对迷惑的。最后在Issue 1206 of SDWebImage in Github中发现maxCacheSize只是在cleanDiskWithCompletionBlock方法中使用到,而这个方法只会被cleanDisk(手动清理disk缓存)backgroundCleanDisk (当应用切到后台时清理disk缓存)调用,并不会动态的维持cache的大小。所以在程序运行时并不会动态管理内存大小。

而maxMemoryCost是直接设置NSCache的totalCostLimit属性,而NSCache会动态的保持内存cache的大小。此外maxMemoryCost设置的是内存缓存中所有照片的像素总数量。

maxCacheSize表示的意思应该是清理disk缓存时,disk缓存中能储存的最大size。不考虑内存缓存也不动态控制内存缓存大小。

cleanDiskWithCompletionBlock方法中使用到maxCacheSize的代码段如下:

        // If our remaining disk cache exceeds a configured maximum size, perform a second
        // size-based cleanup pass.  We delete the oldest files first.
        if (self.maxCacheSize > 0 && currentCacheSize > self.maxCacheSize) {
            // Target half of our maximum cache size for this cleanup pass.
            const NSUInteger desiredCacheSize = self.maxCacheSize / 2;

            // Sort the remaining cache files by their last modification time (oldest first).
            NSArray *sortedFiles = [cacheFiles keysSortedByValueWithOptions:NSSortConcurrent
                                                            usingComparator:^NSComparisonResult(id obj1, id obj2) {
                                                                return [obj1[NSURLContentModificationDateKey] compare:obj2[NSURLContentModificationDateKey]];
                                                            }];

            // Delete files until we fall below our desired cache size.
            for (NSURL *fileURL in sortedFiles) {
                if ([_fileManager removeItemAtURL:fileURL error:nil]) {
                    NSDictionary *resourceValues = cacheFiles[fileURL];
                    NSNumber *totalAllocatedSize = resourceValues[NSURLTotalFileAllocatedSizeKey];
                    currentCacheSize -= [totalAllocatedSize unsignedIntegerValue];

                    if (currentCacheSize < desiredCacheSize) {
                        break;
                    }
                }
            }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值