Увеличение использования памяти CFData при использовании фильтров Core Image

У меня проблема со слишком большим объемом выделенной памяти. Мое приложение выделяет память до 100 МБ! И да... я использую ARC. большая часть памяти выделяется CFData (как я понимаю, это CoreImage фильтры). После применения фильтра к изображению CFData выделенная память увеличивается примерно на 1,3 МБ и не освобождается:

Инструменты, показывающие использование памяти

Код выглядит следующим образом:

+(UIImage*)BWFilter:(UIImage *)imgFX
{
    CIImage *sourceImage = [[CIImage alloc] initWithImage:imgFX];

    CIImage *blackAndWhite = [CIFilter filterWithName:@"CIColorControls" keysAndValues:kCIInputImageKey, sourceImage, @"inputBrightness", [NSNumber numberWithFloat:0.0], @"inputContrast", [NSNumber numberWithFloat:1.1], @"inputSaturation", [NSNumber numberWithFloat:0.0], nil].outputImage;
    CIImage *output = [CIFilter filterWithName:@"CIExposureAdjust" keysAndValues:kCIInputImageKey, blackAndWhite, @"inputEV", [NSNumber numberWithFloat:0.7], nil].outputImage;

    CIContext *context = [CIContext contextWithOptions:nil];
    CGImageRef cgiimage = [context createCGImage:output fromRect:output.extent];
    imgFX = [UIImage imageWithCGImage:cgiimage];

    if (cgiimage) {
        CGImageRelease(cgiimage);
    }

    return imgFX;
}

Использование памяти не снижается после предупреждения о памяти, поэтому это не должно быть проблемой кеша.


person Hariz Hent    schedule 30.11.2012    source источник
comment
Как вы храните возвращенное изображение?   -  person Brett    schedule 01.12.2012
comment
Или, другими словами, как выглядит вызывающий код? Пример кода в вопросе выглядит нормально. Кроме того, что говорит инструмент Leaks?   -  person zoul    schedule 01.12.2012
comment
Вы запускали статический анализатор? Продукт › Анализ. Дает ли он вам какую-либо диагностику?   -  person rob mayoff    schedule 01.12.2012
comment
Статический анализатор мне ничего не дает. И течеискатель никаких утечек не показывает. pastebin.com/wDJhzu4G Я вызываю метод ReDraw, чтобы перерисовать все фильтры, хранящиеся в списке.   -  person Hariz Hent    schedule 01.12.2012
comment
Я так понимаю CGImageRelease(cgimg); не работает после первого применения фильтра, потому что он не освобождает изображение, созданное cgimg = [context createCGImage:outputImage fromRect:[exputImage extension]];   -  person Hariz Hent    schedule 03.12.2012


Ответы (1)


Я запустил ваш код в примере проекта (с ARC), и он не дает никаких утечек или дополнительных выделений. CFData по существу не связан с CIFilter подклассами, но с CIImage. Проблема где-то в другом.

person Wladek Surala    schedule 01.09.2013