UIGraphicsGetImageFromCurrentImageContext用于缩放图像的内存泄漏

时间:2010-06-19 11:28:20

标签: memory-leaks uikit image-manipulation

我的iPhone应用程序从服务器下载图像文件,将其存储到NSTemporaryDirectory()中,然后异步加载UI中的图像。代码流是这样的:

  1. 使用加载活动指示器显示视图并在后台运行图像下载。
  2. 下载图像后,会将其写入文件。
  3. 加载视图中的计时器会一直检查临时目录中文件的可用性,一旦可用,就会从文件中加载图像并将图像添加到UI中。
  4. 在添加图像之前,它会缩放到所需的大小。
  5. 问题是,我使用UIGraphicsGetImageFromCurrentImageContext来缩放图像。看起来图像上下文使用的内存未被清理。随着更多文件的下载,应用内存不断增加。

    以下一些代码:

    缩放图片的代码:

    
    -(UIImage*)scaleToSize:(CGSize)size image:(UIImage *)imageref
    {
     UIGraphicsBeginImageContext(size);
     [imageref drawInRect:CGRectMake(0, 0, size.width, size.height)];
     UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
     UIGraphicsEndImageContext();
     return scaledImage;
    }
    

    从临时目录加载图片:

    
    -(void)loadImageFromFile: (NSString *) path
    {
     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
     UIImage * imm = [[[UIImage alloc] initWithContentsOfFile:path] autorelease];
     [self performSelectorOnMainThread:@selector(insertImage:) withObject:imm waitUntilDone:YES];
     [pool release];
    }
    

    添加图片到视图(代码子集):

    
     self.imageContainer = [[UIImageView alloc] initWithFrame:CGRectMake(0,80,320,250)];
     [self addSubview:self.imageContainer];
     self.imageContainer.image = [self scaleToSize:CGSizeMake(320.0f, 250.0f) image:imm];
     [imageContainer release];
    

    我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

避免UIGraphicsGetImageFromCurrentImageContext泄露的一种方法是不要通过调整容器大小来调用它,而不是直接调整图像大小:

self.imageContainer.contentMode = UIViewContentModeScaleAspectFit;
self.imageContainer.frame = CGRectMake(self.imageContainer.frame.origin.x, self.imageContainer.frame.origin.y, 320.0f, 250.0f);