方法返回一个Core Foundation对象,其+1保留计数。

3

有人能告诉我我这里遇到了什么问题吗?

屏幕截图


1
你是否在关闭ARC的情况下编译ARC代码? - Sergey Kalinichenko
毫无疑问,您正在createCGImage中创建图像,然后从未释放它。 - borrrden
@dasblinkenlight 是的,我用了 ARC。 我正在使用 imageTemp = [[UIImage imageWithCGImage:[context createCGImage:outputImage fromRect:outputImage.extent]] autorelease]; 但是收到了“对象发送-autorelease太多次”的警告。 - bachle26
3个回答

6
即使您启用了ARC,那也只涵盖了Cocoa/Objective-C对象。Core Foundation和Core Graphics API是不同的,您仍然需要最终显式释放创建的任何这些对象的内存。
在您的代码中,您正在执行一个未平衡释放的“createCGIImage:”。
释放的样子是:
CGImageRelease(myImageRef) 

因此,要正确地执行此操作,请执行以下操作:

CGImageRef myImageRef = [context createCGImage: outputImage fromRect: outputImage.extent];
UIImage * imageTemp = [UIImage imageWithCGImage: myImageRef];
CGImageRelease(myImageRef);

1
ARC在处理CoreFoundation对象时无关紧要。您需要将其分配给一个CGImageRef变量,然后使用CFRelease(variableName)释放它。
例如:
CGImageRef cgImage = [context createCGImage:...];
// rest of your code here
CFRelease(cgImage);

1

[context createCGImage:fromRect:] 方法返回一个已保留的 CGImageRef。要修复内存泄漏,您需要保存对该 CGImageRef 的引用,并在使用完后释放它:

CGImageRef imageRef = [context createCGImage:outputImage fromRect:outputImage.extend];
imageTemp = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接