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:我有一个标志,它告诉应用程序使用返回的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:调用都会快速增加内存,并且应用程序会在几秒钟后崩溃。当我设置frameBuffernil时,内存不会增加(或者当然我也没有帧缓冲区来进行任何处理)。

我曾尝试转让frameBuffer使用CFRetain和的所有权CFRelease(在上面的代码中注释掉),但这些似乎也没有做任何事情。

有谁知道我可能在这个函数中泄漏内存的地方??? 该方法[[MSImage alloc] initWithBuffer:是形成第三方 SDK(Moodstocks,这是一个很棒的图像识别 SDK),它在他们的演示中工作得很好,所以我不认为问题出在这个函数内部。

4

1 回答 1

0

首先,感谢您提到 Moodstocks(我为他们工作):我们很高兴您发现我们的 SDK 有用!

要回答您的问题,我猜您的代码确实包含泄漏:在imageReconigitionProcessFrame方法结束时,您应该调用[qry release]. Obj-C 中的规则很简单:每当你手动调用alloc一个对象时,它也应该被手动释放!

顺便说一句, Moodstocks SDK包装器中所做的就是:如果您查看该[MSScannerSession session: didOutputSampleBuffer:]方法,您会发现我们确实MSImage在处理完对象后手动释放了该对象。

至于为什么分析器没有发现这个泄漏,我猜这是因为默认情况下每 10 秒分析一次泄漏:在这种情况下,内存泄漏非常严重(1280x720 帧,如果你在 15+ FPS '在 iPhone 5 上持续 10 秒:至少泄露了 130 MB)代码必须在前 10 秒之前崩溃。

希望这可以帮助!

于 2013-08-26T13:55:56.000 回答