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

问题描述 投票:6回答:2

如何在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它,然后在完成它后CFRelease它。 (Apple Document

swift avfoundation
2个回答
1
投票

根据Apple Doc

内存管理对象

从带注释的API返回的Core Foundation对象在Swift中自动进行内存管理 - 您不需要自己调用CFRetain,CFRelease或CFAutorelease函数。

如果从自己的C函数和Objective-C方法返回Core Foundation对象,则可以使用CF_RETURNS_RETAINED或CF_RETURNS_NOT_RETAINED宏对它们进行注释,以自动插入内存管理调用。您还可以使用CF_IMPLICIT_BRIDGING_ENABLED和CF_IMPLICIT_BRIDGING_DISABLED宏来包含遵循Core Foundation所有权策略命名策略的C函数声明,以便从命名推断内存管理。

如果仅使用不间接返回Core Foundation对象的带注释的API,则可以跳过本节的其余部分。否则,继续学习如何使用非托管Core Foundation对象。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.