UICollectionview和图像加载导致内存不足

时间:2014-11-14 20:12:24

标签: ios objective-c uicollectionview sdwebimage

我有一个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"];    

应清除所有分配。请帮我解决我的错误。

1 个答案:

答案 0 :(得分:2)

从iOS 7 NSCache开始,只有在您设置了totalCostLimitcountLimit属性时才会自动删除缓存对象。

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

的更多信息