Я разрабатываю приложение для Mac на Mac OS X 10.6 с использованием Cocoa и Xcode4, после получения изображения из буфера камеры мне нужно получить необработанные данные изображения.Вот код:
- (void)captureOutput:(QTCaptureOutput *)captureOutput didOutputVideoFrame:(CVImageBufferRef)videoFrame withSampleBuffer:(QTSampleBuffer *)sampleBuffer fromConnection:(QTCaptureConnection *)connection
{
CVImageBufferRef imageBufferRef;
@synchronized (self) {
imageBufferRef = CVBufferRetain(videoFrame);
}
if (imageBufferRef) {
CIImage *originalImage = [CIImage imageWithCVImageBuffer:imageBufferRef];
// Denoise
[noiseReductionFilter setValue:originalImage forKey:@"inputImage"];
CIImage *denoisedImage = [noiseReductionFilter valueForKey:@"outputImage"];
NSCIImageRep *denoisedImageRep = [NSCIImageRep imageRepWithCIImage:denoisedImage];
//
NSImage *image = [[NSImage alloc] initWithSize:[denoisedImageRep size]];
[image addRepresentation:denoisedImageRep];
NSUInteger width = CVPixelBufferGetWidth(imageBufferRef);
NSUInteger height = CVPixelBufferGetHeight(imageBufferRef);
NSUInteger bytesPerRow = CVPixelBufferGetBytesPerRow(imageBufferRef);
NSUInteger bitsPerSample = [denoisedImageRep bitsPerSample];
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGImageSourceRef source = CGImageSourceCreateWithData((CFDataRef)[image TIFFRepresentation], NULL);
CGImageRef imageRef = CGImageSourceCreateImageAtIndex(source, 0, NULL);
[image release];
unsigned char *rawData = malloc(height * width * 4);
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Big);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
CGContextRelease(context);
CGImageRelease(imageRef);
CGColorSpaceRelease(colorSpace);
free(rawData);
CVBufferRelease(imageBufferRef);
}
}
(Я удалил некоторый код, чтобы он выглядел более понятным, и код, который я удалил, гарантированно не пропускает память. И я сожалею, что переменные не идеальноnamed.)
Проблема в строке:
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
Я думаю, что после "CGContextRelease (context);" память должна быть освобождена.Но после того, как я запустил это приложение, память быстро истощается - увеличивается примерно на 20 МБ в Real Mem каждую секунду.
Я попытался удалить эту строку CGContextDrawImage, память, кажется, работает правильно - увеличивается только на десятки или сотни КБ насекунда.
Я использовал Инструмент для анализа своего приложения, но утечки памяти не обнаружено.
Кто-нибудь может помочь мне решить эту проблему?Я работал над этим в течение многих дней, но не нашел ни решения, ни даже причины.
Я очень признателен, если вы можете дать мне какое-либо предложение по улучшению этого кода или устранению любых других проблем внутри него.,Как будто даже если я удалю эту строку, она все равно съедает память, хотя и медленно, но если я блокирую весь метод, память не истощается, поэтому я считаю, что в коде все еще есть некоторые проблемы.
Яновичок здесь, пожалуйста, прости меня, если мой пост не в правильном формате, и мой плохой английский.