在按照之前我的那片博文介绍的方法修复了强引用造成的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;
}
}
}