2015-08-08 295 views
1

早上好,CIImage/CGImageRef的内存管理问题

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

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

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

随着评论部分不断发表评论,内存使用情况稳定且可以接受,但如果我取消注释,内存不会停止增加。请注意,如果我留下过滤操作注释,并且只保留CIImage的创建和转换回CGImageRef,问题依然存在。 (我的意思是:我不认为这与过滤器本身有关)。

如果我运行XCode的分析,它会指出潜在的内存泄漏,如果这部分未注释,但没有评论。

有没有人有想法解释和解决这个问题? 非常感谢!

注意:我不喜欢使用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); 

回答

0

两个vImageCreateCGImageFromBuffer()-[CIContext createCGImage:fromRect:]给大家一个参考,你是负责释放。你只是释放其中一个。

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

+0

实际上,我现在可以看到记忆在一段时间内增加和减少,全局保持在可接受的水平。谢谢你的帮助 ! – zan