CMSampleBufferRef sampleBuffer = [assetOutput copyNextSampleBuffer];
CMBlockBufferRef buffer = CMSampleBufferGetDataBuffer(sampleBuffer);
CMBlockBufferAppendBufferReference(_sem == 0 ? _buffer0 : _buffer1, buffer, 0, 0, 0);
//if(sampleBuffer)
// CFRelease(sampleBuffer);
为什么这会导致第一行出现内存泄漏(至少这是 Leaks 建议的地方)?我有我的assetOutput.shouldAlwaysCopySampleOutput = NO。以下是我对情况的理解:
CMSampleBufferRef sampleBuffer = [assetOutput copyNextSampleBuffer];
此行将从assetOutput 创建对样本缓冲区的引用。
CMBlockBufferRef buffer = CMSampleBufferGetDataBuffer(sampleBuffer);
此行将从 CMSampleBuffer 中获取 CMBlockBuffer 但不会分配新的缓冲区,在这种情况下 Get 方法意味着它是一个临时(自动释放)缓冲区
CMBlockBufferAppendBufferReference(_sem == 0 ? _buffer0 : _buffer1, buffer, 0, 0, 0);
此行会将上面创建的 CMBlockBuffer的引用附加到选定的全局范围缓冲区。它不会复制任何内存块。
因此,在这三行中,我都没有分配任何内存,也没有复制任何内存,都是引用。我不明白泄漏是从哪里来的。我尝试添加注释掉的行,但它似乎仍然泄漏(虽然次数更少)