如何在Swift中使用“CFRetain(sampleBuffer)”和“CFRelease(sampleBuffer)”? 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)
内存管理对象
从带注释的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对象。
你只需要sampleBuffer = nil
手动释放。但是建议在使用它之前复制指针CMSampleBufferCreateCopy(kCFAllocatorDefault, sampleBuffer, &newBuffer)
。在这种情况下,在创建新的newBuffer
副本之前将sampleBuffer
设置为nil。