【发布时间】:2014-01-05 21:44:39
【问题描述】:
在我的 iPhone 应用程序中,我有一个缓存到磁盘的大图像,我在将图像交给一个对该图像进行大量处理的类之前检索它。接收类只需要简单的图像进行一些初始化,我想尽快释放图像占用的内存,因为图像处理代码非常占用内存,但我不知道如何。
看起来像这样:
// inside viewController
- (void) pressedRender
{
UIImage *imageToProcess = [[EGOCache globalCache] imageForKey:@"reallyBigImage"];
UIImage *finalImage = [frameBuffer renderImage:imageToProcess];
// save the image
}
// inside frameBuffer class
- (UIImage *)renderImage:(UIImage *)startingImage
{
CGContextRef context = CGBitmapCreateContext(....)
CGContextDrawImage(context, rect, startingImage.CGImage);
// at this point, I no longer need the image
// and would like to release the memory it's taking up
// lots of image processing/memory usage here...
// return the processed image
CGImageRef tmpImage = CGBitmapContextCreateImage(context);
CGContextRelease(context);
UIImage *renderedImage = [UIImage imageWithCGImage:tmpImage];
CGImageRelease(tmpImage);
return renderedImage;
}
这可能很明显,但我遗漏了一些东西。谢谢。
【问题讨论】:
-
你试过自动释放池吗?
-
我查看了自动释放池,但没有看到如何在 CGContextDrawImage 之后立即释放内存。似乎自动释放池会在整个 renderImage 方法完成后释放它......这为时已晚。但话又说回来,我对自动释放池不是很精通。
-
你肯定需要添加一个CGContextRelease()来释放引用的上下文。
-
您要释放哪个对象?如果你试图在
renderImage中释放startingImage,你真的不应该因为那个方法不“拥有”那个对象。 -
我正在尝试在将startingImage 绘制到上下文后释放它。我知道 frameBuffer 不拥有它,但那是我需要释放它的地方。我认为 Rob 的回答可能是最好的方法。
标签: ios objective-c memory image-processing uiimage