UIImageView+AFNetworking 管理缓存和分配

Posted

技术标签:

【中文标题】UIImageView+AFNetworking 管理缓存和分配【英文标题】:UIImageView+AFNetworking Managing Caching & Allocations 【发布时间】:2015-02-16 18:54:32 【问题描述】:

我正在使用UIImageView+AFNetworking,以便从UITableView 中的URL 下载和显示图像。一切都很好,我的问题是关于这个调用实现的缓存元素和分配。

在使用工具来跟踪内存时,我发现当我滚动时,我最大的内存分配很快就变成了VM: Foundation,它看起来好像正在以某种方式缓存我正在下载的图像。

当查看相同的图像但我从未看到它释放内存时,这对用户来说非常有用。 (我还没有得到内存警告)。我只是想确保在需要时这个分配将在需要时释放。下面是那些VM : Foundation的堆栈轨迹

我是否需要对此进行监控并在需要时释放缓存的内存以确保平滑滚动?或者我还应该注意什么以确保正确处理?

这是我在cellForRowAtIndexPath 中调用图像的方式,我调用的是setImageWithURLRequest。任何建议或改进将不胜感激。

   NSString *imageURL = [NSString stringWithFormat:@"https://IMAGE-URL/%@",imageURL];
        __weak MainTableViewCell *weakCell = cell;
        NSURLRequest *urlRequest = [[NSURLRequest alloc]initWithURL:[NSURL URLWithString:imageURL]];

        [cell.postImage setImageWithURLRequest:urlRequest placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) 

            MainTableViewCell *strongCell = weakCell;
            strongCell.postImage.image = image;

            [UIView animateWithDuration:.15 animations:^
                strongCell.postImage.alpha = 1;
            ];

         failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) 

        ];

【问题讨论】:

【参考方案1】:

您真的不应该担心清除图像缓存,因为AFNetworking 会自动为您处理。

它在NSCache 内部存储图像,就像docs 所说:

结合了各种自动删除策略,确保它不会使用过多的系统内存。如果其他应用程序需要内存,系统会自动执行这些策略。调用时,这些策略会从缓存中删除一些项目,从而最大限度地减少其内存占用。

然而,在AFNetworking 开发期间,有一些troubles 具有这种自动删除行为,因此最终在接收UIApplicationDidReceiveMemoryWarningNotification 时添加了手动缓存clearing。但这一切都发生在内部,你不应该自己做。

【讨论】:

感谢您的确认。我只是想确保我没有遗漏任何东西

以上是关于UIImageView+AFNetworking 管理缓存和分配的主要内容,如果未能解决你的问题,请参考以下文章

UIImageView+Afnetworking 无法正常工作

AFNetworking 和 UIImageView 更新线程问题

UIImageview+AFNetworking 淡入,图片缓存时也一样

使用 UIImageView+AFNetworking,图像直到滚动才会出现

使用 AFNetworking setImageWithURL 设置 UIImageView 圆角:

带有 UIActivityIndi​​catorView 参考内存的 UIImageView+AFNetworking 类别是不是保留?