3

私はコアファウンデーションプログラミングに非常に慣れていないので、自分がやろうとしていることは正しいのか知りたいです。私は ARC を使用していますが、ARC がオブジェクト以外の参照をどのように処理するかわかりません。サンプル バッファーへの参照を保存し、後でアプリ内で使用する必要があります。これは可能ですか、それ以前にサンプル バッファの割り当てが解除されますか?

self.sampleBuffer = sampleBuffer_; を使用します。メモリリークを引き起こしますか?この呼び出しの後にリリースする手動呼び出しを追加する必要がありますか?

@property (nonatomic)CMSampleBufferRef sampleBuffer;

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer_ fromConnection:(AVCaptureConnection *)connection
{
    //does this cause memory leak?
    self.sampleBuffer = sampleBuffer_;
}
4

1 に答える 1

2

メモリ リークは発生しません。実際、プロパティにはassignデフォルトで属性があり、割り当てられたオブジェクトを保持 (つまり、所有) しないため、オブジェクトが解放されて問題が発生する可能性が高くなります。

サンプル バッファーをプロパティにする必要があるほど長く保持している場合は、おそらくドキュメントに従って、デリゲートに渡されたオブジェクトを保持するのではなく、サンプルを独自のバッファーにコピーする必要があります。

提供された CMSampleBuffer オブジェクトを長時間保持することでアプリケーションがサンプルを削除しているが、サンプル データに長期間アクセスする必要がある場合は、データを新しいバッファにコピーしてからサンプル バッファを解放することを検討してください (以前は保持されていた) ため、参照するメモリを再利用できます。

一方、本当にサンプル バッファーへの参照を保持したい場合は、他のすべてをそのまま保持CFRetainし、プロパティに割り当てる前にオブジェクトを呼び出すことができます (以前に割り当てられたオブジェクトであることを確認してくださいCFRelease)。strongこれは、Foundation オブジェクトの属性と同等のセマンティクスを持ちます。

于 2012-04-27T02:13:39.223 に答える