iOS 使用SDWebImage加载多图大图时退出页面或退到后台时需要手动清理内存吗?

SDWebImage,地球人都在用。带着问题去考虑下SDWebImage
问题1:一个tableView列表,使用SD加载图片,有历史加载,数据可达几千条;退出页面需要手动清理吗?
问题2:如果页面有很多张大图,退出页面需要清理吗?
问题3:app在100MB和300MB退到后台,被杀掉的概率相同吗?

1.问题1、问题2

在加载历史数据时或有多张大图时,内存会增长很快,如果在内存警告前退出页面,内存是不会降低的。如果收到内存警告,则会移除所有内存缓存的图片。


iOS 使用SDWebImage加载多图大图时退出页面或退到后台时需要手动清理内存吗?_第1张图片
加载历史数据的内存

图中是模拟器测试的数据,然而真机并不会到这么多。我的手机是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 ()
@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.只有了解原因了,才知道问题非问题,要不然心里有块石头总是放不下。

你可能感兴趣的:(iOS 使用SDWebImage加载多图大图时退出页面或退到后台时需要手动清理内存吗?)