gpt4 book ai didi

ios - 如何在接收方法中快速释放内存?

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:44:30 25 4
gpt4 key购买 nike

在我的 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;
}

这可能很明显,但我遗漏了一些东西。谢谢。

最佳答案

@Jonah.at.GoDaddy 走在正确的轨道上,但我会更明确地说明所有这些,而不是依赖 ARC 优化。 ARC 在 Debug模式下的积极性要低得多,因此除非您采取措施,否则在调试时内存使用量可能会变得过高。

UIImage *imageToProcess = [[EGOCache globalCache] imageForKey:@"reallyBigImage"];

首先,我假设 imageForKey: 本身不缓存任何内容,也不调用 imageNamed:(缓存内容)。

关键是当你想让内存消失时,你需要将你的指针置零。如果您将图像从一个地方传递到另一个地方(Jonah 的解决方案也解决了这个问题),那将非常困难。就个人而言,我可能会做这样的事情来尽可能快地从 image->context 中获取:

CGContextRef CreateContextForImage(UIImage *image) {
CGContextRef context = CGBitmapCreateContext(....)
CGContextDrawImage(context, rect, image.CGImage);
return context;
}

- (void) pressedRender {

CGContextRef context = NULL;

// I'm adding an @autoreleasepool here just in case there are some extra
// autoreleases attached by imageForKey: (which it's free to do). It also nicely
// bounds the references to imageToProcess.
@autoreleasepool {
UIImage *imageToProcess = [[EGOCache globalCache] imageForKey:@"reallyBigImage"];
context = CreateContextForImage(imageToProcess);
}
// The image should be gone now; there is no reference to it in scope.

UIImage *finalImage = [frameBuffer renderImageForContext:context];
CGContextRelease(context);
// save the image
}


// inside frameBuffer class
- (UIImage *)renderImageForContext:(CGContextRef)context
{
// lots of memory usage here...
return renderedImage;
}

对于调试,您可以通过向其添加关联的观察器来确保 UIImage 确实消失了。查看 How to enforce using `-retainCount` method and `-dealloc` selector under ARC? 的已接受答案(答案与问题无关;它恰好解决了您可能觉得有用的同一件事)。

关于ios - 如何在接收方法中快速释放内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20645857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com