2013-07-05 71 views
0

这里是我的方法:如何用+1保留计数(ARC)修复Core Foundation对象?

CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(aSampleBuffer); 

CIImage *ciImage = [CIImage imageWithCVPixelBuffer:imageBuffer]; 

CIContext *context = [CIContext contextWithOptions:nil]; 
CGImageRef myImage = [context 
         createCGImage:ciImage 
         fromRect:CGRectMake(0, 0, 
              CVPixelBufferGetWidth(imageBuffer), 
              CVPixelBufferGetHeight(imageBuffer))]; 

return [UIImage imageWithCGImage:myImage]; 

但最后一行显示我是Potential leak of an object stored into 'myimage',并MYIMAGE线是Method returns a Core Foundation object with a +1 retain count。但我的应用程序是启用ARC,所以我不能release的东西。我该如何解决它?谢谢。

+1

顺便说一句,“所以我不能释放的东西” - 读什么警告说。你的对象是一个CoreFoundation对象,你不会释放它,而是你调用它的CFRelease对象(或者,在这种情况下,它有一个指定的释放函数)。 ARC不应该禁止这一点。 – 2013-07-05 10:43:45

回答

4

我的应用程序启用了ARC,所以我不能释放一些

错误。 ARC阻止您将release消息发送到Objective-C对象,因为它为您管理其内存。

但是,您仍然必须在其他任何情况下(即C结构)手动管理内存。您可以 - 并且必须 - 在适当的时候在这样的结构上使用retain/release函数。

在这种情况下,你必须手动调用CGImageReleasemyImage,平衡保留计数,这样做(如提出H2CO3)

UIImage *retVal = [UIImage imageWithCGImage:myImage]; 
    CGImageRelease(myImage); 
    return retVal; 
+1

'UIImage'和'CGImageRef'是*免费桥接。并没有'CFImage'。我假设你的第二个解决方案会崩溃。 –

+0

@MartinR。劳累的一天。你是对的,我会删除那部分 –

+0

@MartinR完成。感谢您指出我答案中的壮观错误;)在我的防守中,这是意大利这个疯狂的热天! –

5
UIImage *retVal = [UIImage imageWithCGImage:myImage]; 
CGImageRelease(myImage); 
return retVal; 
相关问题