Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone -[UIImage drawInRect://CGContextDrawImage()是否未释放内存?_Iphone_Memory Management_Uiimage - Fatal编程技术网

Iphone -[UIImage drawInRect://CGContextDrawImage()是否未释放内存?

Iphone -[UIImage drawInRect://CGContextDrawImage()是否未释放内存?,iphone,memory-management,uiimage,Iphone,Memory Management,Uiimage,我想在另一个背景图像上轻松地混合一个UIImage,因此为UIImage编写了一个分类方法,改编自: 不幸的是,我的应用程序使用上述方法加载了大约20幅图像,并将它们与背景图像和光泽图像混合(因此可能有40次左右的调用),现在已经被设备抛弃了 Instruments会话显示,对drawInRect:的调用产生的对malloc的调用负责大部分内存使用。我尝试用对函数CGContextDrawImage的等效函数调用替换drawInRect:messages,但没有任何帮助。自动释放池是在我发现内存

我想在另一个背景图像上轻松地混合一个UIImage,因此为UIImage编写了一个分类方法,改编自:

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

Instruments会话显示,对drawInRect:的调用产生的对malloc的调用负责大部分内存使用。我尝试用对函数CGContextDrawImage的等效函数调用替换drawInRect:messages,但没有任何帮助。自动释放池是在我发现内存使用问题后添加的;这也没什么不同

我想这可能是因为我没有恰当地使用图形上下文。由于我创建了大量的上下文,在循环中调用上述方法会是一个坏主意吗?还是我只是错过了什么

- 编辑1:谢谢你的评论。该方法在设置20个视图的控制器方法中调用,因此在循环中我有以下调用:

    UIImage *blendedImage = [newImage blendedImageOn:backgroundImage];
我添加了自动释放池,以确保在主自动释放池释放图像之前释放图像,因此理论上,所有新的UIImages对象都应该在循环完成后释放。分析结果没有显示自动释放池是否在其中有任何区别

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

- 编辑3:修复了因自动释放池而发布UIImage的尴尬错误。自动释放池的目的是释放结果UIImage以外的任何对象,以防内存过多是由于添加到主自动释放池的临时对象没有立即释放而造成的


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

您不应该直接调用
drawRect:
方法。使用
[self-setneddsddisplay]取而代之(它不会帮助您处理此泄漏)

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

代码的一个问题是,您得到的blendedImage对象被标记为自动释放,当您释放临时自动释放池时,poof,您也会释放blendedImage

您可以保留,直到池被释放,然后返回自动释放:

...
UIImage* blendedImage = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext();
[blendedImage retain];       // keep this past pool release
[pool release];

[blendedimage autorelease];  // now it will be autoreleased from the main pool

return [blendedImage release];  // release to balance out the retain above

我发现问题是内存使用过多。我的图像比我预期的要大得多,在调用将它们绘制到图形上下文中的POST方法之前,将背景图像调整为视图大小,解决了内存使用问题

我仍然不明白为什么在图像上下文结束时内存没有被回收。

根据,任何返回“已拥有”对象(未自动删除)的方法都应该以“alloc”或“new”开头,或者应该包含“copy”


您的名字“blendedImageOn”不符合这些准则。如果您在一个月内使用它,或者其他人使用它,您将记不起图像是否保留在内存中,您将出现内存泄漏。

将一个图像写入另一个图像是drawInRect。非常确定setNeedsDisplay不会这样做!对不起,我弄错了,请阅读drawRect:而不是drawInRect。无论如何,答案的第二部分仍然存在。最好显示作者如何调用blendedImageOn方法.True+1用于捕获池中自动释放的对象。(听起来完全错了。)progrmr,接得好。事实上,我已经发布了故障排除代码,该代码没有显示我的症状,但正如您所指出的,它显示了一个完全不同的内存问题。好的,抱歉弄得一团糟:-(我编辑了代码并重新表述了问题描述,希望它能澄清我遇到的问题。关于名称,我想名称应该是更详细的“imageByBlendingImage:”。但是,该方法不会返回“owned”对象,因为在返回时,由于自动释放,保留计数应该平衡为0。This符合内存使用指南:通过向对象发送释放消息或自动释放消息(自动释放在“自动释放”中有更详细的讨论)来放弃对象的所有权。因此,在Cocoa术语中,放弃对象的所有权通常称为“释放”一个对象。对此很抱歉..我可能是在注释旧版本的代码,或者我看不清楚;-)当然,现在看起来代码返回了一个自动释放的对象,方法名也不错。
...
UIImage* blendedImage = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext();
[blendedImage retain];       // keep this past pool release
[pool release];

[blendedimage autorelease];  // now it will be autoreleased from the main pool

return [blendedImage release];  // release to balance out the retain above