我有一个UICollectionView并在每个单元格中加载图像。图像加载由SDWebImage处理,并以
的形式下载[_ImageView sd_setImageWithURL:[NSURL URLWithString:imageURL] placeholderImage:[UIImage imageNamed:@"Icon-120"]];
插入到集合视图由代码
处理for(NSString *data in datas)
{
Cell *newCell = [[Cell alloc] initWithDictionary:cellDict];
[_allcells insertObject:newCell atIndex:0];
[_collectionView reloadData];
}
当用户触摸它时,我们会关闭集合视图,并清空数据源。
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
[_collectionView setHidden:YES];
[_allcells removeAllObjects];
[[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"];
}
当我在5/6次后运行此代码时,我得到低内存警告。我试图清空图像下载的内存缓存。
- (void)didReceiveMemoryWarning {
// Dispose of any resources that can be recreated.
[[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"];
[_collectionView setHidden:YES];
[_allcells removeAllObjects];
[super didReceiveMemoryWarning];
NSLog(@"Received Low Memory");
}
我试图附上文书并查看分配。每次下载图像时,我都会看到5 x 8.1 MB的CoreImage分配。当我打电话时,我的印象是
[[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"];
应清除所有分配。请帮我解决我的错误。
答案 0 :(得分:2)
从iOS 7 NSCache
开始,只有在您设置了totalCostLimit
或countLimit
属性时才会自动删除缓存对象。
SDImageCache
尝试使用NSCache
totalCostLimit
来限制mem-cached图像的数量。但它永远不会为共享maxMemoryCost
实例设置SDImageCache
。显然你应该自己做。
他们如何计算每张图片的费用:
[self.memCache setObject:image forKey:key cost:image.size.height * image.size.width * image.scale * image.scale];
所以它只是一个图像像素大小。我们假设每个像素在内存中占用32个(您可以使用CGImageGetBitsPerPixel
函数检查每个像素的实际位数,但SDImageCache
忽略它。所以每个像素大概需要4个字节的内存。
尝试将maxMemoryCost
限制设置为合理的数量。像这样:
NSProcessInfo *info = [NSProcessInfo processInfo];
// Compute total cost limit in bytes
NSUInteger totalCostLimit = (NSUInteger)(info.physicalMemory * 0.15); // Use 15% of available RAM
// Divide totalCostLimit in bytes by number of bytes per pixel
[[SDImageCache sharedImageCache].maxMemoryCost = totalCostLimit / 4;
如果您未设置maxMemoryCost
SDImageCache
,则只会删除内存警告上的内存缓存图像。
您可以阅读有关图片缓存和NSCache
here