1

AVCaptureSessionデバイスカメラからの「ライブ」ビデオストリームを表示するために、を使用しているアプリに取り組んでいます。また、ビデオがまだ画面に表示されている間 ( を使用)、sampleBuffer からAVCaptureVideoDataOutputSampleBufferDelegate静止画像をキャプチャするメソッド ( ) を使用してこれらの画像を処理します。とにかく、ここには貼り付けきれないくらいたくさんのコードがありますが、それは実際には重要ではありません。UIImageOpenCV

アプリは数秒後にメモリ警告を表示し、さらに数秒後に静かにクラッシュします。Instruments を使用してリークとメモリ割り当てを検査しようとしましたが、疑わしいものは何も表示されず、リークもまったくなく、メモリ使用量が 5MB (全体およびライブ バイト) を超えることはありません。

メモリ警告がトリガーされる理由を確認するにはどうすればよいですか?

編集:コードに意図的なリークを追加しようとしましたが、これは Instruments に表示されるため、理論的には機能するようです...

4

2 に答える 2

2

あなたが抱えている問題はUIImage、Apple の舞台裏のバッファリングの使用に関連していると思います。iOS の PDF 機能を使用しているときに、同様の問題が発生しました。コードを投稿していないので、具体的に提案できるのは、リリース コマンド (つまり. など) を発行しCGImageRelease()CGContextRelease()参照と実際のデータの違いを常に念頭に置くことだけです。

于 2012-05-22T08:13:34.697 に答える
1

理由はわかりましたが、Instruments がこれを表示しない理由はわかりません...

使った[t performSelectorInBackground:sel withObject:[self imageFromSampleBuffer:sampleBuffer]];

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection

方法。それをコメントアウトした後、アプリは正常に動作します。ここでの問題はNSLock、セレクターで a を使用したにもかかわらず、メモリ制限に達するまで、アプリが各セレクターに対してますます多くのスレッドを生成することでした。したがって、ここでの解決策は、セレクター メソッド内ではなく、セレクターを実行する前にロックを使用することです。

ご助力いただきありがとうございます。

于 2012-05-22T08:25:21.957 に答える