如何在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它,然后在完成后再发送它。 (Apple Document)
答案 0 :(得分:1)
内存管理对象
自动注释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。