如何在Swift中使用“CFRetain(sampleBuffer)”?

时间:2016-07-01 07:21:40

标签: swift avfoundation

如何在Swift中使用“CFRetain(sampleBuffer)”和“CFRelease(sampleBuffer)”? enter image description here CFRetain is unavailable: Core Foundation objectes are automatically memory managed.

 - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection 
{

    [self appendVideoSampleBuffer:sampleBuffer];

}

- (void)appendVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer
{
    dispatch_async( _writingQueue, ^{

        CFRetain(sampleBuffer);
        [_videoInput appendSampleBuffer:sampleBuffer];
        CFRelease(sampleBuffer);

    });
}
  

如果需要在此方法范围之外引用CMSampleBuffer对象,则必须CFRetain它,然后在完成后再发送它。   (Apple Document

2 个答案:

答案 0 :(得分:1)

根据Apple Doc

内存管理对象

  

自动注释API返回的Core Foundation对象   在Swift中管理的内存 - 你不需要调用CFRetain,   CFRelease或CFAutorelease自己发挥作用。

     

如果从自己的C函数返回Core Foundation对象   Objective-C方法,你可以用它们来注释它们   CF_RETURNS_RETAINED或CF_RETURNS_NOT_RETAINED宏自动生成   插入内存管理调用。你也可以使用   CF_IMPLICIT_BRIDGING_ENABLED和CF_IMPLICIT_BRIDGING_DISABLED宏   包含Core Foundation之后的C函数声明   所有权政策命名政策,以推断内存管理   来自命名。

     

如果仅使用未间接返回Core的带注释的API   基础对象,您可以跳过本节的其余部分。除此以外,   继续学习如何使用非托管Core Foundation   对象。

答案 1 :(得分:0)

您只需要sampleBuffer = nil手动发布。 但建议在使用前复制指针 CMSampleBufferCreateCopy(kCFAllocatorDefault, sampleBuffer, &newBuffer) 。在这种情况下,在创建新newBuffer的副本之前将sampleBuffer设置为nil。