2016-08-10 5 views
0

최근 PHAssets를 사용하여 프로젝트의 이전 자산을 대체합니다. 그러나 내 그림을 사용하여 일부 그림의 크기를 조정할 때 일반적으로 충돌이 발생합니다. 디버그 모드를 사용하면 메모리 문제라는 것을 알았습니다. 내가 심지어 방법은 완료 생각 코드drawInRect를 사용하여 그림의 크기를 조절하는 메모리

[img drawInRect:CGRectMake(0,0, sb.width, sb.height)] 

실행이 그리고 그것은 무료로 살고 있고하지 않을 때는 50M에 대해 증가 사진을

+(UIImage*)scaleRetangleToFitLen:(UIImage *)img sWidth:(float)wid sHeight:(float)hei{ 
    CGSize sb = img.size;; 
    if (img.size.height/img.size.width > hei/wid) { 
     sb = CGSizeMake(wid,wid*img.size.height/img.size.width); 
    }else{ 
     sb = CGSizeMake(img.size.width*hei/img.size.height,hei); 
    } 
    if (sb.width > img.size.width || sb.height > img.size.height) { 
     sb = img.size; 
    } 
    UIImage* scaledImage = nil; 
    UIGraphicsBeginImageContext(sb); 
    [img drawInRect:CGRectMake(0,0, sb.width, sb.height)]; 
    scaledImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    img = nil; 
    return scaledImage; 
} 

메모리의 크기를 조정하기 위해 아래의 코드를 사용합니다. 너비와 높이가 304 * 228, 이미지 원본 크기는 약 3264 * 2448, 반환되는 이미지는 304 * 228이며, 이는 내가 바라는 실제 이미지가 단지 304 * 228 크기의 이미지라는 것을 의미하지만, 50 + M 메모리 .. drawInRect : 함수를 사용하는 메모리를 해제 할 수있는 방법이 있습니까? (@autoreleasepool이 작동하지 않습니다 ~)

답변

0

이미지를로드 할 때 iOS는 실제로 필요할 때까지 압축을 해제하지 않습니다. 따라서 함수에 전달하는 이미지는 iOS가 압축 된 상태로 메모리에 보관하는 JPEG 또는 PNG 이미지 일 가능성이 큽니다. 그릴 순간에 압축이 풀리면 메모리가 크게 늘어납니다. 3264 x 2448 x 4 = 35MB (50MB가 아님)만큼 증가 할 것으로 예상됩니다.

메모리를 다시 없애려면 함수에 전달한 이미지에 대한 참조를 모두 해제해야합니다. 그래서 문제는 당신이 당신의 질문에 보여주는 코드 밖에 있습니다.

더 구체적인 답변을 보려면 원본 이미지와 함께 작동하는 모든 코드를 표시해야합니다.

+0

당신의 응답에 감사드립니다. 코드는 다음과 같습니다 : (더 나은 독서를 위해 아래에 코멘트에 내 코드를 추가하고 있습니다) – AFu

+0

위 코드가 내 대답에 있습니다, 지금은 "UIImage * ti = [[ pv.image.image copy]; " 대신에 "UIImage * ti = pv.image.image;"하지만 작동하지 않습니다. 그것은 복사 개체와 원래 개체가 동일한 이미지에 연결되어있는 것처럼 보입니다. 이미지를 그리면 메모리가 증가하지만 원본 개체는 무료로 설정되지 않으므로 메모리가 해제되지 않습니다. 이런 종류의 상황 (UIImageView 객체는 35M 버전이 필요하지 않지만 draw 메소드를 사용하여 35M으로 가져온 후 35M 버전을 어떻게 작게 설정할 수 있습니까?) – AFu

+0

3264 * 2448 크기의 이미지는 처음에는 작은 버전을 사용해야하므로 무승부가 그렇게 많이 증가하지 않습니다 ~ ~ – AFu