2012-02-22 6 views
4

"누출"도구를 사용하여 표시되지 않는 대량의 메모리 누수가 발생합니다. 모달 뷰 컨트롤러를 팝업하고 4 개 또는 5 개의 이미지에 2 개의 CoreImage 필터를 적용합니다. 인스 트루먼 트를 사용하면 이러한 이미지가 생성 될 때 메모리가 약 40-50MB 정도 올라갈 수 있지만, 모달 뷰 컨트롤러를 닫은 후에도 절대로 메모리가 다시 돌아 오지 않으며이 프로세스를 2 ~ 3 번 반복하면 응용 프로그램이 중단됩니다 . 이것이 나를 미치게 만들었 기 때문에 당신이 제공 할 수있는 조언에 만족합니다. 나는 아래의 코드를 사용하여 imageWithData를 사용하여 imageNamed로 전환 한 사용자는ARC를 사용하여 신비한 CoreImage 메모리 누출

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 x 768 png이고 다른 몇 개는 1700 x 1300 일 수도 있습니다. 왜 이러한 필터를 처리하는 데 많은 메모리가 필요합니까? 왜 그것이 공개되지 않는지 이해하지 못합니다. –

+0

다음번에이 함수를 호출하기 전에 templateImageView를 제거 하시겠습니까? –

+0

아니요, 최종 이미지에 추가되는 각 이미지는 자신의 UIImageView입니다. templateImageView는 단순히 묶음의 첫 번째 것입니다. –

답변

2

: 다음은 문제의 방법이다. 테스트 (미안하지만, 지금이 문제에 대해 12 시간 가까이 지 냈습니다)에서 동일한 작업에 대한 실제 메모리 사용량이 최대 50 % 낮아졌습니다 (115mb 대 최대 230mb). 신비한 "푸시 + 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 메가를 절약했습니다. 감사. –