美文网首页iOS面试
iOS 使用SDWebImage加载多图大图时退出页面或退到后台

iOS 使用SDWebImage加载多图大图时退出页面或退到后台

作者: 某非著名程序员 | 来源:发表于2019-10-25 13:57 被阅读0次

    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.只有了解原因了,才知道问题非问题,要不然心里有块石头总是放不下。

    相关文章

      网友评论

        本文标题:iOS 使用SDWebImage加载多图大图时退出页面或退到后台

        本文链接:https://www.haomeiwen.com/subject/mpdsvctx.html