【问题标题】:Memory management issue with CIImage / CGImageRefCIImage / CGImageRef 的内存管理问题
【发布时间】:2015-08-08 12:41:14
【问题描述】:

早上好,

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

以下代码是 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);

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 实际上,我现在可以看到内存定期增加和减少,总体上保持在可接受的水平。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    相关资源
    最近更新 更多