次のコードを使用して、カメラからフレームをキャプチャしています。
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
:(AVCaptureConnection *)connection
{
// Create a UIImage from the sample buffer data
UIImage *image = [self imageFromSampleBuffer:sampleBuffer];
if(delegate && [delegate respondsToSelector:@selector(captureManagerCapturedFrame:withFrameImage:withFrameBuffer:)]) {
[delegate captureManagerCapturedFrame:self withFrameImage:image withFrameBuffer:sampleBuffer];
}
}
これを行っているのは、デリゲート メソッドに、返されたまたはcaptureManagerCapturedFrame:withFrameImage:withFrameBuffer:
返されたのいずれかを使用するようにアプリに指示するフラグがあるためです。uiimage
sampleBuffer
デリゲート メソッドは次のとおりです。
- (void) captureManagerCapturedFrame:(AVCamCaptureManager *)captureManager
withFrameImage:(UIImage *)image
withFrameBuffer:(CMSampleBufferRef)frameBuffer {
if(_screen1) {
NSLog(@"Only display camera image\n");
}
else if(_screen2) {
//Enable IR
NSLog(@"Display AND Process camera image\n");
[self imageReconigitionProcessFrame:frameBuffer];
}
}
どこにimageReconigitionProcessFrame:
ある:
-(void)imageReconigitionProcessFrame:(CMSampleBufferRef)frameBuffer {
//CFRetain(frameBuffer);
MSImage *qry = [[MSImage alloc] initWithBuffer:frameBuffer orientation:AVCaptureVideoOrientationPortrait]; //MEMORY LEAK HERE???
qry = nil;
//CFRelease(frameBuffer);
}
このコードは効果的に機能します。しかし、ここに私の問題があります。このコードをインストルメントで実行してプロファイリングすると、overall bytes
使用済みが急速に増加していることがわかりますが、割り当てプロファイラーは増加していないようです。また、リーク ツールを使用しても「リーク」は見られません。しかし、明らかに、呼び出されるたびにメモリが急速に増加imageReconigitionProcessFrame:
し、数秒後にアプリがクラッシュします。に設定frameBuffer
するとnil
、メモリは増加しません (または、処理を行うためのフレーム バッファもありません)。
and (上記のコードでコメントアウト) をframeBuffer
使用して所有権を譲渡しようとしましたが、これらも何もしないようです。CFRetain
CFRelease
この関数内でメモリがリークしている可能性がある場所を知っている人はいますか???
この方法[[MSImage alloc] initWithBuffer:
はサードパーティの SDK (素晴らしい画像認識 SDK であるMoodstocks ) の形式であり、デモでは問題なく動作するため、この関数内に問題があるとは思いません。