UIImage,发布解压缩缓存?

时间:2010-10-30 07:54:21

标签: iphone uiimageview uiimage

我有一个UIImages数组,其中包含应用启动时从网上下载的一些.jpg图像。我还有一个表视图,在其单元格中显示了一些这些图像。问题是当我滚动表格时,应用程序的内存消耗总是增加到应用程序因内存不足而崩溃的程度。表格单元似乎可以重复使用,所以我的理论如下。

由于表格单元格中的UIImageView仅保留图像数组中的一个元素,当单元格被重用,并为其分配新图像时,以前使用的图像当然不会被破坏(单元格会释放它) ,但阵列仍然保留)。但是,用于保存原始图像数据的解压缩缓存(在第一次由视图显示UIImage时计算)属于UIImage本身,因此它也保留。但我只是猜测这一切。

这真的是问题吗?如果是这样,我该如何解决呢?我的第一个想法是在分配给单元格时创建UIImage的副本,但看起来UIImages不能被深层复制。有没有办法告诉UIImage将压缩的jpg数据保留在内存中但丢弃解压缩缓存? (在最坏的情况下,我想我仍然可以下载所有图像并将它们存储在本地文件中,然后从那里加载它们并在不再显示时完全释放UIImages,但这似乎不是一个优雅的解决方案。)< / p>

-

我无法发布原始代码(如评论中所示),因为它相当复杂的自定义表格单元格和自定义视图,甚至后台线程下载图像,但我刚刚创建了一个小测试应用程序,它似乎表现出相同的行为。这是在用户点击UIButton时调用的一个小函数:

- (IBAction)onNext:(UIButton*)sender
{
    static NSMutableArray* images = nil; 
    if (!images)
    {
        NSArray* names = [NSArray arrayWithObjects:
            @"IMG_2957.JPG", 
            @"IMG_2962.JPG", 
            @"IMG_2965.JPG", 
            @"IMG_2970.JPG", 
            @"IMG_2971.JPG", 
            @"IMG_2978.JPG", 
            nil];
        images = [NSMutableArray new];
        for (int i = 0; i < names.count; ++i)
            [images addObject:[UIImage imageNamed:[names objectAtIndex:i]]];
        int i = 42;
    }
    static int current = 0;

    imageView.image = [images objectAtIndex:current];
    ++current; 
}

是的,我知道图像阵列正在泄漏,这不是重点(在原始代码中我也希望在应用程序的整个生命周期中保留图像,并且仅在退出时释放)。但。根据Memory Monitor,在第一次点击后(所有图像都被加载,并显示第一个图像),应用程序消耗约5MB(所有jpgs加载,其中一个解压缩)。在所有后续的点击之后,内存消耗增加了大约2MB(是的,我测试了1024x768图像)。因此看起来先前显示的图像的解压缩数据仍然存在。我知道如果我再次看不到它就释放了图像就不会有问题了,这也会释放解压缩的缓冲区,但如果可能的话,我想保留所有图像,并且只释放解压缩数据。这可能吗?

2 个答案:

答案 0 :(得分:2)

如果您正在重复使用单元格,请确保这些单元格实现:

-(void)prepareForReuse
{
      // releasing the image
      self.imageView = nil; // Or release depending on you memory strategy
      self.labelView = nil; // get them all
}

答案 1 :(得分:1)

我不认为UIImage没有致命的内存泄漏。我一直在研究一些由于内存限制而必须大量释放UIImage的应用程序,但它仍然可以正常工作。我相信你的图像在某个地方泄漏了。向我们展示一些代码,以便有人为您指出。