iPhone - UIImage imageScaledToSize Memory Issue

时间:2009-09-14 22:47:10

标签: iphone memory-management uiimage malloc

我已经做过研究并尝试了几次释放UIImage内存并且没有成功。我在互联网上看到另一篇帖子,其他人也遇到了同样的问题。每次调用imageScaledToSize时,ObjectAlloc都会继续爬升。

在下面的代码中,我从资源目录中提取本地图像,并使用一些模糊调整其大小。 有人可以提供一些帮助来解释如何释放被称为...... scaledImage和labelImage 的UIImages的内存。这是iPhone Intruments显示出构建ObjectAlloc的代码块。使用NSTimer多次调用此代码块。

//Get local image from inside resource
NSString * fileLocation = [[NSBundle mainBundle] pathForResource:imgMain ofType:@"jpg"];
    NSData * imageData = [NSData dataWithContentsOfFile:fileLocation];
    UIImage * blurMe = [UIImage imageWithData:imageData];

//Resize and blur image
    UIImage * scaledImage = [blurMe _imageScaledToSize:CGSizeMake(blurMe.size.width / dblBlurLevel, blurMe.size.width / dblBlurLevel) interpolationQuality:3.0];
    UIImage * labelImage = [scaledImage _imageScaledToSize:blurMe.size interpolationQuality:3.0];
    imgView.image = labelImage;

1 个答案:

答案 0 :(得分:0)

您可以将调用包装在NSAutoreleasePool中,其结果将汇集在一起​​。然后你可以在那个池上调用[pool drain],它的内容将被释放,包括图像。

但是请注意,您将无法使用NSAutoreleasePool范围之外的图像,因此您可能希望代码看起来像:

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

UIImage * scaledImage = [blurMe _imageScaledToSize:CGSizeMake(blurMe.size.width / dblBlurLevel, blurMe.size.width / dblBlurLevel) interpolationQuality:3.0];
UIImage * labelImage = [scaledImage _imageScaledToSize:blurMe.size interpolationQuality:3.0];
UIImage * imageCopy = [[UIImage alloc] initWithCGImage:labelImage.CGImage]; // Gives a non-autoreleased copy of labelImage

[pool drain]; // deallocates scaledImage and labelImage

imgView.image = imageCopy; // retains imageCopy

<强>更新

如果上述内容仍然存在问题,请参阅我发布到this question的解决方案。问题涉及将图像旋转90度而不是缩放它,但前提是相同的(它只是不同的矩阵变换)。使用我发布的答案中的代码可以让您更好地控制内存管理,并避免使用像_imageScaledToSize这样的未记录的API。