这是我的代码。我在一个干净的新Xcode项目中使用这样的代码,内存使用是稳定的。但是在我公司的应用程序中,内存消耗每7秒钟就会持续增长,最终应用程序崩溃了。
我使用
模拟视频缓冲处理算法for(int volatile i = 0; i < 100000000; i++){}
我将setAlwaysDiscardsLateVideoFrames设置为YES。
奇怪的事情: 1.在测试应用程序中,内存保持正常。 2.在我公司的应用中,内存在iPhone5s(8.3)上不断增长,但在iPhone5(8.2)上却没有。 3.删除didOutputSampleBuffer中的for循环,我公司的应用程序也能很好地运行而不会增加内存。
总而言之,如果我在缓冲区回调函数中执行一个耗时的算法,并且只在我公司的应用程序中,内存不断增长。在带有活动监视器的乐器上,我可以看到内存在增长。但我看不到分配工具的分配细节。它似乎是CG栅格数据。
-(BOOL) setupAVCapture{
session = [AVCaptureSession new];
[session setSessionPreset:AVCaptureSessionPreset640x480];
AVCaptureDevicePosition desiredPosition = AVCaptureDevicePositionFront;
for (AVCaptureDevice *d in [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]) {
if ([d position] == desiredPosition) {
[session beginConfiguration];
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:d error:nil];
for (AVCaptureInput *oldInput in [ session inputs]) {
[ session removeInput:oldInput];
}
[ session addInput:input];
[ session commitConfiguration];
break;
}
}
// Make a video data output
videoDataOutput = [AVCaptureVideoDataOutput new];
// we want BGRA, both CoreGraphics and OpenGL work well with 'BGRA'
NSDictionary *rgbOutputSettings = [NSDictionary dictionaryWithObject:
[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey];
[videoDataOutput setVideoSettings:rgbOutputSettings];
[videoDataOutput setAlwaysDiscardsLateVideoFrames:YES]; // discard if the data output queue is blocked (as we process the still image)
videoDataOutputQueue = dispatch_queue_create("MYFDVideoDataOutputQueue", DISPATCH_QUEUE_SERIAL);
[videoDataOutput setSampleBufferDelegate:self queue:videoDataOutputQueue];
if ( [session canAddOutput:videoDataOutput] )
[session addOutput:videoDataOutput];
[[videoDataOutput connectionWithMediaType:AVMediaTypeVideo] setEnabled:YES];
[session startRunning];
return YES;
}
#pragma mark delegate
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
CFRetain(sampleBuffer);
for(int volatile i = 0; i < 100000000; i++){}
CFRelease(sampleBuffer);
}