早上好,
我在尝试编写的视频处理软件中遇到内存管理问题。 (视频捕捉+(几乎)实时处理+显示+录制)。
以下代码是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);
答案 0 :(得分:0)
vImageCreateCGImageFromBuffer()
和-[CIContext createCGImage:fromRect:]
都会为您提供您负责发布的参考。你只发布其中一个。
当您使用新convertedImage
替换CGImageRef
的值时,您将丢失对前一个的引用而不释放它。在您最后一次使用旧图像之后,在丢失该参考之前,您需要再次向CGImageRelease(convertedImage)
调用。