CMSampleBufferRef sampleBuffer = [assetOutput copyNextSampleBuffer];
CMBlockBufferRef buffer = CMSampleBufferGetDataBuffer(sampleBuffer);
CMBlockBufferAppendBufferReference(_sem == 0 ? _buffer0 : _buffer1, buffer, 0, 0, 0);
//if(sampleBuffer)
// CFRelease(sampleBuffer);
なぜこれが最初の行でメモリリークを引き起こすのですか? 私の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の参照を、選択したグローバル スコープ バッファーに追加します。メモリ ブロックはコピーされません。
したがって、これらの 3 つの行のいずれにおいても、メモリを割り当てたり、メモリをコピーしたりすることはありません。すべて参照です。漏れがどこから来ているのかわかりません。コメントアウトされた行を追加しようとしましたが、まだリークしているようです (回数は少ないですが)