2012-02-22 8 views
4

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

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]; 
+0

Для справки, некоторые из изображений модифицируются 1024 х 768 PNGs и несколько других крупнее, может быть 1700 х 1300. Я понимаю, почему это занимает много памяти грызть эти фильтры, я просто дон Не понимаю, почему он не освобождается. –

+0

Вы удаляете свой шаблонImageView, прежде чем вы вызываете эту функцию в следующий раз –

+0

Нет, каждое изображение, которое добавлено в finalView, имеет собственный UIImageView. templateImageView - это просто первый из них. –

ответ

2

Я переключился с использованием 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]; 
+0

'imageNamed:' кэширует полученные изображения, поэтому его следует использовать в основном для изображений, которые используются более одного раза (например, значки на панели инструментов и т. п.). – omz

+0

Это только спасло нас 70 мегабайт. Благодарю. –

 Смежные вопросы

  • Нет связанных вопросов^_^