SDWebImage,地球人都在用。带着问题去考虑下SDWebImage
问题1:一个tableView列表,使用SD加载图片,有历史加载,数据可达几千条;退出页面需要手动清理吗?
问题2:如果页面有很多张大图,退出页面需要清理吗?
问题3:app在100MB和300MB退到后台,被杀掉的概率相同吗?
1.问题1、问题2
在加载历史数据时或有多张大图时,内存会增长很快,如果在内存警告前退出页面,内存是不会降低的。如果收到内存警告,则会移除所有内存缓存的图片。
加载历史数据的内存
图中是模拟器测试的数据,然而真机并不会到这么多。我的手机是iPhone8,内存是2GB,然而真正在500MB左右就收到内存警告。
下面是SDImageCache在收到内存警告的代码:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(clearMemory)
name:UIApplicationDidReceiveMemoryWarningNotification
object:nil];
- (void)clearMemory {
[self.memCache removeAllObjects];
}
2.问题3
这个问题也困扰很久,经测试发现退到后台后,内存会降到一个稳定的初始值。找了许久的SDWebImage源码,发现并没有处理过退到后台清理内存的逻辑。
细想NSCache的特性:会在切换到后台清理掉数据,而SDWebImage内存缓存使用的就是NSCache。下面只要验证NSCache在切换到后台能清理缓存,就不用担心了。
@interface CleanMemoryBackgroundViewController ()<NSCacheDelegate>
@property (nonatomic,strong) NSCache * cache;
@end
@implementation CleanMemoryBackgroundViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor whiteColor];
_cache = [NSCache new];
_cache.delegate = self;
[self.cache setObject:@"1" forKey:@"1"];
[self.cache setObject:@"2" forKey:@"2"];
[self.cache setObject:@"3" forKey:@"3"];
}
- (void)cache:(NSCache *)cache willEvictObject:(id)obj{
NSLog(@"释放_%@",(NSString *)obj);
}
@end
总结:
1.针对问题1和问题2,我给UIImageView+WebCache添加了一个管理类,按url使用在退出页面时清理页面内所使用的缓存。后面细细品读SDWebImage源码,发现多此一举。
2.问题3,当我验证NSCache在切换到后台会自动清理,发现担心的问题根本不存在。
3.当然如果是别的问题引起的,还是要考虑问题3的,假如不是图片引起的问题,有机会还是要验证下。
4.只有了解原因了,才知道问题非问题,要不然心里有块石头总是放不下。
网友评论