CGContextDrawImage съедает мою память, любая утечка памяти? - PullRequest
3 голосов
/ 18 июля 2011

Я разрабатываю приложение для 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, память, кажется, работает правильно - увеличивается только на десятки или сотни КБ насекунда.

Я использовал Инструмент для анализа своего приложения, но утечки памяти не обнаружено.

Кто-нибудь может помочь мне решить эту проблему?Я работал над этим в течение многих дней, но не нашел ни решения, ни даже причины.

Я очень признателен, если вы можете дать мне какое-либо предложение по улучшению этого кода или устранению любых других проблем внутри него.,Как будто даже если я удалю эту строку, она все равно съедает память, хотя и медленно, но если я блокирую весь метод, память не истощается, поэтому я считаю, что в коде все еще есть некоторые проблемы.

Яновичок здесь, пожалуйста, прости меня, если мой пост не в правильном формате, и мой плохой английский.

1 Ответ

1 голос
/ 10 июля 2014

Спасибо за подсказку ersentekin , теперь я могу закрыть этот вопрос.Ответ был:

Найдена проблема!Это в строке "CGImageSourceRef source = CGImageSourceCreateWithData((CFDataRef)[image TIFFRepresentation], NULL);" - я не выпустил "source"!

...