Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone UIImage,释放解压缩缓存?_Iphone_Uiimageview_Uiimage - Fatal编程技术网

Iphone UIImage,释放解压缩缓存?

Iphone UIImage,释放解压缩缓存?,iphone,uiimageview,uiimage,Iphone,Uiimageview,Uiimage,我有一个UIImages数组,其中包含应用程序启动时从网上下载的一些.jpg图像。我还有一个表格视图,它在单元格中显示了其中的一些图像。问题是,当我滚动表格时,应用程序的内存消耗总是会增加到应用程序因内存不足而崩溃的程度。表格单元格似乎可以很好地重用,因此我的理论如下 由于表单元格中的UIImageView仅保留图像数组中的一个元素,因此当该单元格被重用并为其分配新图像时,以前使用的图像当然不会被破坏(单元格释放它,但数组仍保留它)。但是,用于保存原始图像数据(在视图第一次显示UIImage时计

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

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

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

--

我无法发布原始代码(如评论中所建议的),因为它与自定义表格单元格和自定义视图相当复杂,甚至还有一个下载图像的后台线程,但我刚刚创建了一个小测试应用程序,它似乎显示了相同的行为。以下是当用户点击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; 
}
-(iAction)onNext:(UIButton*)发送方
{
静态NSMUTABLEARRY*images=nil;
如果(!图像)
{
NSArray*名称=[NSArray arrayWithObjects:
@“IMG_2957.JPG”,
@“IMG_2962.JPG”,
@“IMG_2965.JPG”,
@“IMG_2970.JPG”,
@“IMG_2971.JPG”,
@“IMG_2978.JPG”,
零];
图像=[NSMUTABLEARRY new];
对于(int i=0;i

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

我认为UIImage没有那么致命的内存泄漏。我一直在开发一些应用程序,由于内存限制,这些应用程序不得不大量释放UIImage,但它仍然可以正常工作。我相信你的形象在某处泄露了。向我们展示一些代码,以便有人能为您指出。

我认为UIImage没有那么严重的内存泄漏。我一直在开发一些应用程序,由于内存限制,这些应用程序不得不大量释放UIImage,但它仍然可以正常工作。我相信你的形象在某处泄露了。向我们展示一些代码,以便有人为您指出。

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

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

如果要重用单元,请确保这些单元实现:

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

从技术上讲,这不是泄漏;如果我发布UIImages,我相信解压的缓冲区会很好地发布。但是,我想保留图像,我只想释放解压缩后的数据。我已经编辑了这个问题来显示一些代码。我认为你做不到。我也不认为UIImage会在内部保存压缩数据。如果你真的想缓存数据,我建议使用NSData;如果我发布UIImages,我相信解压的缓冲区会很好地发布。但是,我想保留图像,我只想释放解压缩后的数据。我已经编辑了这个问题来显示一些代码。我认为你做不到。我也不认为UIImage会在内部保存压缩数据。如果您真的想缓存数据,我建议您使用NSData来缓存数据。