2014-03-30 3 views
0

내가 다음 코드를 사용하여 for 루프 내부의 여러 UIImage 객체의 크기를 조정하려고 누출의 원인이되는 :아이폰 OS 이미지 크기를 조정하면 메모리가

CGFloat scaledToWidth:resized_width = 160.0; 
for(UIImage *img in imageArray) { 
    UIImage *resizedImageSecond = [self resizeImage:img scaledToWidth:resized_width]; 
    //Do something with resizedImageSecond  
} 

-(UIImage*)resizeImage:(UIImage*) sourceImage scaledToWidth: (float) i_width 
{ 
    float oldWidth = sourceImage.size.width; 
    float scaleFactor = i_width/oldWidth; 

    float newHeight = sourceImage.size.height * scaleFactor; 
    float newWidth = oldWidth * scaleFactor; 

    UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight)); 
    [sourceImage drawInRect:CGRectMake(0, 0, newWidth, newHeight)]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 
    return newImage; 
} 

을하지만 내 메모리 사용량이 빠르게 resizeImage:scaledToWidth:의 모든 반복을 통해 증가 참조 . 나는 여기에 끔찍한 기억 누출을 보지 못했지만, 나도 잘 모르겠다.

내 메모리 사용이이 기능에서 증가하는 이유가 누구에게 보이나요? 나는 여기서 잃어 버렸다. 불행히도 UIImageimageArray 안에 있으므로 가능한 한 메모리를 보수적으로 사용해야합니다.

+0

크기가 조정 된 이미지를 만든 다음에 해제하려면 '@ autoreleasepool' 블록에서 루프 본문을 래핑하십시오. 그렇지 않다면 직선 루프보다 자원 집약적 인 방법을 찾아야합니다. – CodaFi

+0

@CodaFi 내 프로젝트는 ARC이므로 어디에도 명시 적으로 공개하지 않습니다. 내가 있어야 할까? – Brett

+0

또한 Instruments를 사용하여 Allocations Leaks 도구를 배포하는 방법을 배우고 호출자가 참조 횟수를 늘리거나 줄이는 목록으로 누출을 확인하십시오. 귀중한 학습 도구이자 디버깅 도구입니다. – RobP

답변

1

resizeImage:scaledToWidth:을 사용할 때마다 UIImage 인스턴스를 새로 만듭니다. 그것이 기억력 증대의 이유입니다. 가장 간단한 해결책은 이미지가 더 이상 필요하지 않을 때 nil으로 설정하는 것입니다.

for(UIImage *img in imageArray) { 
    @autoreleasepool { 
     UIImage *resizedImage = [self resizeImage:img scaledToWidth:resized_width]; 

     //Do something with resizedImage 

     resizedImage = nil; 
    }  
} 
+0

그렇다면 ARC 프로젝트 (광산과 같은)에서 범위를 벗어날 때 공개되지 않는 이유는 무엇입니까? (즉, 루프를 계속 하시겠습니까?) – Brett

+0

실제로'resizedImage = nil'을 설정했고 변경이 없습니다. – Brett

+0

ARC는 개체 수명주기를 보장하지 않습니다. 당신이 알고있는 누구나는 노동 조합 지부가 어느 시점에서 공개 될 것이다라는 것이다. 이것은 잠재적으로 문제를 해결할 아무 것도 할 수 없습니다. – CodaFi

관련 문제