Таинственная утечка памяти в CoreImage с помощью ARC - PullRequest
4 голосов
/ 22 февраля 2012

Я испытываю серьезные утечки памяти, которые не обнаруживаются при использовании инструмента «утечки».Я открываю Modal View Controller и применяю 2 фильтра CoreImage к 4 или 5 различным изображениям.Используя инструменты, я вижу, как при создании этих изображений увеличивается объем памяти примерно на 40-50 МБ, но даже после того, как я уволил Modal View Controller, я никогда не получаю эту память обратно, и приложение повторяется после повторения этого процесса 2 или 3 раза.,Я рад любому совету, который вы можете дать, потому что это сводит меня с ума.Ниже рассмотрен метод:

UIView *finalView = [[UIView alloc] initWithFrame:CGRectMake(1024, 0, 1792, 1345)];
UIImageView *templateImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 1792, 1345)];
templateImageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@.png",[theme objectForKey:@"template_background"]]];

//CI background Setup
NSString *filePath5 = [[NSBundle mainBundle] pathForResource:[theme objectForKey:@"template_background"] ofType:@"png"];
NSURL *fileNameAndPath5 = [NSURL fileURLWithPath:filePath5];

    @autoreleasepool {

        finalBackBeginImage = [CIImage imageWithContentsOfURL:fileNameAndPath5];
        finalBackImage = [CIFilter filterWithName:@"CIHueAdjust" keysAndValues:@"inputAngle", [NSNumber numberWithFloat:[[boothPrefs objectForKey:@"templateBackground_hue"] floatValue]*6.28], @"inputImage", finalBackBeginImage, nil].outputImage;
        finalBackImage = [CIFilter filterWithName:@"CIColorControls" keysAndValues:@"inputSaturation", [NSNumber numberWithFloat:([[boothPrefs objectForKey:@"templateBackground_saturation"] floatValue] * 5)], @"inputImage", finalBackImage, nil].outputImage;

        finalBackContent = [CIContext contextWithOptions:nil];
        CGImageRef cgimgFinalBack = 
        [finalBackContent createCGImage:finalBackImage fromRect:[finalBackImage extent]];
        UIImage *newFinalBackImg = [UIImage imageWithCGImage:cgimgFinalBack];
        [templateImageView setImage:newFinalBackImg];
        CGImageRelease(cgimgFinalBack);

    }

[finalView addSubview:templateImageView];

1 Ответ

2 голосов
/ 04 апреля 2013

Я переключился с использования imageNamed на использование imageWithData с использованием приведенного ниже кода. Через 5 минут тестирования (извините, я потратил около 12 часов на эту проблему сейчас), я вижу, что мое реальное использование памяти для той же операции снижается на 50% (115 МБ против 230 МБ) и таинственный «Push + 80mb, pop -30mb» - проблема с реальной памятью решена.

Я держу пальцы скрещенными.

//use images like this as base images for CIFilters
    NSData* imageData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:self.frameName ofType:nil]];
        ;
        UIImage* imageForFilter =[UIImage imageWithData: imageData];
...