我正在使用AFNetworking 3.0的UIImageView + AFNetworking在UICollectionView中显示图像。
然而,随着我不断滚动,我的应用程序的内存使用量不断增长。我使用了仪器分配工具,并且能够将问题缩小到CG栅格数据,这对于每个加载的图像都在不断增长。查看CG Raster Data
的详细信息,负责的调用者是cgdataprovidercreatewithcopyofdata
,负责的库是CoreGraphics
。对于每个加载的单元,浪费了240 KB的内存。
堆栈溢出有很多类似的问题,但没有一个真正有用/有解决方案。
我认为这可能是由于缓存造成的,所以我启用了以下功能,但根本没有帮助:
NSURLCache * sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:10 * 1024 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
我尝试将setImageWithURLRequest
包裹在autoreleasepool
内但没有帮助。
我尝试在整个应用中搜索cgdataprovidercreatewithcopyofdata
,但我发现我的应用或afnetworking没有点击。但是,如果我删除图像的加载,那么我没有看到这个问题。
此外,如果我在完成处理程序中删除图像的设置,内存仍然会增长。这意味着setImageWithURLRequest
本身就是罪魁祸首而不是完成处理程序中图像的设置。
我一直在努力解决这个问题,任何帮助都会受到赞赏!
这是我设置图片的代码:
[cell.thumbnail cancelImageDownloadTask];
__weak UIImageView *weakImageView = cell.thumbnail;
@autoreleasepool {
[cell.thumbnail setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://myurl/image.png"]]
placeholderImage:[UIImage imageNamed:@"placeholder.png"]
success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
UIImageView *strongImageView = weakImageView; // make local strong reference to protect against race conditions
if (!strongImageView) return;
[UIView transitionWithView:strongImageView
duration:0.3
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^{
strongImageView.image = image;
}
completion:NULL];
}
failure:NULL];
以下是各种乐器的截图:
答案 0 :(得分:0)
我使用@ajay gabani响应来使用SDWebImage而不是AFNetworking的ImageView。
在SDWebImage中,它至少提供了清除缓存的方法,并且可以控制图像是缓存在磁盘中还是仅缓存在内存中。
我将maxMemoryCountLimit设置为10,但在我的测试中似乎没有做太多事情:
SDImageCache *imageCache = [SDImageCache sharedImageCache];
imageCache.maxMemoryCountLimit=10;
我每隔几秒就清除一次缓存:
[NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(simulateMemoryWarning) userInfo:nil repeats:YES];
- (void)simulateMemoryWarning{
[[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationDidReceiveMemoryWarningNotification object:nil];
SDImageCache *imageCache = [SDImageCache sharedImageCache];
NSLog(@"Simulated");
[imageCache clearMemory];
[imageCache clearDisk];
}