gpt4 book ai didi

iphone - -[UIImage绘制矩形:]/CGContextDrawImage() not releasing memory?

转载 作者:行者123 更新时间:2023-12-03 20:11:00 24 4
gpt4 key购买 nike

我想轻松地将 UIImage 混合到另一个背景图像之上,因此为 UIImage 编写了一个类别方法,改编自 blend two uiimages based on alpha/transparency of top image :

- (UIImage *) blendedImageOn:(UIImage *) backgroundImage  {
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
UIGraphicsBeginImageContext(backgroundImage.size);

CGRect rect = CGRectMake(0, 0, backgroundImage.size.width, backgroundImage.size.height);
[backgroundImage drawInRect:rect];
[self drawInRect:rect];
UIImage* blendedImage = [UIGraphicsGetImageFromCurrentImageContext() retain];

UIGraphicsEndImageContext();
[pool release];

return [blendedImage autorelease];
}

不幸的是,我的应用程序使用上述方法加载大约 20 个图像并将它们与背景和光泽图像混合(因此可能大约 40 个调用),正在设备上被抛弃。

Instruments session 显示,源自对 drawInRect: 的调用对 malloc 的调用造成了大部分内存使用。我尝试用对函数 CGContextDrawImage 的等效函数调用替换 drawInRect: 消息,但没有帮助。 AutoReleasePool是我发现内存使用问题后添加的;这也没有什么区别。

我认为这可能是因为我没有正确使用图形上下文。由于我创建的上下文数量较多,在循环中调用上述方法会是一个坏主意吗?或者我只是错过了什么?

-编辑1:感谢您的评论。该方法在设置 20 个 View 的 Controller 方法中调用,因此在循环中我进行了以下调用:

    UIImage *blendedImage = [newImage blendedImageOn:backgroundImage];

我添加了自动释放池,以确保在主自动释放池释放图像之前释放图像,因此理论上所有新的 UIImages 对象都应该在循环完成时释放。无论自动释放池是否存在,分析结果都没有显示任何差异。

-编辑2:是的,我也尝试在调用 BlendedImageOn: 之前添加自动释放池,但没有效果。

-编辑3:修复了由于自动释放池而导致UIImage被释放的尴尬错误。自动释放池的目的是释放除结果 UIImage 之外的任何对象,以防由于添加到主自动释放池中的临时对象未立即释放而导致内存过多。

我想问的问题(非常糟糕,我承认!)是:为什么调用这个方法 20 次会导致大量内存使用?

最佳答案

您不应该直接调用drawRect:方法。使用 [self setNeddsDisplay]; (它不会帮助您解决此泄漏问题);

关于你的泄密。删除有关池的所有内容。您的方法返回自动释放的 UIImage 对象。请将代码粘贴到您使用返回的 UIImage 的位置,我将能够为您提供帮助。您很可能应该在调用 blishedImageOn: 的地方创建池,并每 3-5 次迭代耗尽池。

关于iphone - -[UIImage绘制矩形:]/CGContextDrawImage() not releasing memory?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2961770/

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