2009-09-14 54 views
0

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

在下面的代码中,我从我的资源目录中拉出一个本地图像,并用一些模糊来调整它的大小。 有人可以提供一些帮助,如何释放名为.... 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

其他人是否有另一种可能的解决方案呢?由于imageScaledToSize调用,我的objectalloc仍然在攀升 – bbullis21 2009-09-16 03:08:01

回答

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 

UPDATE:

如果以上仍然会给您带来问题,请参阅我发布到this question的解决方案。这个问题涉及将图像旋转90度而不是缩放,但前提是相同的(只是矩阵变换不同)。使用类似于我发布的答案中的代码应该可以更好地控制内存管理,并避免使用未公开的API(如_imageScaledToSize)。

+0

你会碰巧有一个小例子吗?我从来没有使用过NSAutoreleasePool – bbullis21 2009-09-14 22:55:26

+0

这可能是一个愚蠢的问题,但如果我无法使用NSAutorelease Pool之外的图像,我将如何在您的示例中使用imageCopy? – bbullis21 2009-09-14 23:01:08

+0

(我更新了这个例子,试图更清楚些。)'imageCopy'没有放入autorelease池中,并且需要你的代码进行内存管理,这是你想要的,因为你在'imgView'中使用它将持续比自动释放池更长的时间。 autorelease池中的图像 - labelImage和scaledImage - 在池已经耗尽后没有引用,所以你没事。 – fbrereto 2009-09-14 23:10:50