CIImage / CGImageRef的内存管理问题

时间:2015-08-08 12:41:15

标签: objective-c core-graphics core-image

早上好,

我在尝试编写的视频处理软件中遇到内存管理问题。 (视频捕捉+(几乎)实时处理+显示+录制)。

以下代码是AVCaptureVideoDataOutputSampleBufferDelegate的“..didOutputSampleBuffer ..”函数的一部分。

capturePreviewLayer是一个CALayer。 ctx是我一遍又一遍地重复使用的CIContext。 outImage是一个vImage_Buffer。

评论部分保持评论状态,内存使用情况稳定且可接受,但如果我取消注释,内存将不会停止增加。请注意,如果我对过滤操作进行注释并且仅保留CIImage创建和转换回CGImageRef,则问题仍然存在。 (我的意思是:我不认为这与过滤器本身有关)。

如果我运行XCode的Analyze,它会指出一个潜在的内存泄漏,如果这部分是未注释的,但如果被注释则没有。

有人有想法解释并解决这个问题吗? 非常感谢你!

注意:我不想使用AVCaptureVideoPreviewLayer及其过滤器属性。

CGImageRef convertedImage = vImageCreateCGImageFromBuffer(&outImage, &outputFormat, NULL, NULL, 0, &err);

//CIImage * img = [CIImage imageWithCGImage:convertedImage];
////[acc setValue:img forKey:@"inputImage"];
////img = [acc valueForKey:@"outputImage"];
//convertedImage = [self.ctx createCGImage:img fromRect:img.extent];

dispatch_sync(dispatch_get_main_queue(), ^{
   self.capturePreviewLayer.contents = (__bridge id)(convertedImage);
});

CGImageRelease(convertedImage);
free(outImage.data);

1 个答案:

答案 0 :(得分:0)

vImageCreateCGImageFromBuffer()-[CIContext createCGImage:fromRect:]都会为您提供您负责发布的参考。你只发布其中一个。

当您使用新convertedImage替换CGImageRef的值时,您将丢失对前一个的引用而不释放它。在您最后一次使用旧图像之后,在丢失该参考之前,您需要再次向CGImageRelease(convertedImage)调用。