我正在使用代码从相机捕获帧:
- (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
时,内存不会增加(或者当然我也没有帧缓冲区来进行任何处理)。
我曾尝试转让frameBuffer
使用CFRetain
和的所有权CFRelease
(在上面的代码中注释掉),但这些似乎也没有做任何事情。
有谁知道我可能在这个函数中泄漏内存的地方???
该方法[[MSImage alloc] initWithBuffer:
是形成第三方 SDK(Moodstocks,这是一个很棒的图像识别 SDK),它在他们的演示中工作得很好,所以我不认为问题出在这个函数内部。