3
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 つの行のいずれにおいても、メモリを割り当てたり、メモリをコピーしたりすることはありません。すべて参照です。漏れがどこから来ているのかわかりません。コメントアウトされた行を追加しようとしましたが、まだリークしているようです (回数は少ないですが)

4

2 に答える 2

6

alwaysCopiesSampleDataメモリ管理に関するものではありません。元のサンプル バッファーまたは元のクローンのどちらに落書きしているかだけです。ちょっと残念な名前です。

copyNextSampleBuffer作成ルールに従っているため、作業が完了したら解放する必要があります。少なくとも 1 の保持カウントを持つ参照を作成します。

ルールの作成:

https://developer.apple.com/library/ios/DOCUMENTATION/CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html#//apple_ref/doc/uid/20001148-103029

Apple のドキュメント リンクは変更される傾向がありますが、上記のリンクが無効になっている場合は、「The Create Rule」をググってください。

于 2013-08-27T18:46:16.013 に答える