我已经做过研究并尝试了几次释放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;
答案 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。