0

次のコードを使用して、カメラからフレームをキャプチャしています。

- (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:返されたのいずれかを使用するようにアプリに指示するフラグがあるためです。uiimagesampleBuffer

デリゲート メソッドは次のとおりです。

- (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使用して所有権を譲渡しようとしましたが、これらも何もしないようです。CFRetainCFRelease

この関数内でメモリがリークしている可能性がある場所を知っている人はいますか??? この方法[[MSImage alloc] initWithBuffer:はサードパーティの SDK (素晴らしい画像認識 SDK であるMoodstocks ) の形式であり、デモでは問題なく動作するため、この関数内に問題があるとは思いません。

4

1 に答える 1