0

App.net 사용자가 업로드 한 표지 이미지를 다운로드 중입니다. App.net에서는 이러한 표지 이미지의 너비가 최소 960 픽셀 이상이어야합니다. 나는 간단한 AFImageRequestOperation으로 그들을 가져 오기 :이, 아니 메모리 스파이크를 작동하지왜 UIImages를 디스크에 저장하면 메모리 사용량이 증가합니까?

NSURLRequest *urlRequest = [NSURLRequest requestWithURL:URL]; 
AFImageRequestOperation *imageRequestOperation = [AFImageRequestOperation imageRequestOperationWithRequest:urlRequest success:^(UIImage *image) { 
    if (completionHandler) { 
     completionHandler(image); // Load image into UI... 
    } 
}]; 
[self.fetchQueue addOperation:imageRequestOperation]; 

.

인증 된 사용자의 이미지를 캐싱하여 사용자가 앱을 열 때마다 다운로드하지 않아도됩니다. 다운로드 한 이미지를 디스크에 저장하자 마자 큰 소리를냅니다. 예를 들어, 내 표지 이미지는 현재 3264 x 2448 픽셀입니다. 내 Mac에서 다운로드하면 약 1,3 MB가됩니다. 그러나 UIImagePNGRepresentation(image) 또는 TMCachesetObject:forKey: 메서드를 사용하여 NSData 객체를 만들면 사용 된 메모리가 약 60,0MB로 증가합니다.

명확하게하기 위해,이 모두가 내가 파일을 디스크에 기록하고있어입니다 :

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
    NSURL *fileURL = ... // URL of file in "/Application Support" 
    NSData *imageData = UIImagePNGRepresentation(imageToSave); 
    [imageData writeToURL:fileURL atomically:YES]; 
}); 

사람이 무슨 일이 일어나고 있는지 말해 줄래? 1,3 MB가 거의 60 배로 추정되는 이유는 무엇입니까? 이 거대하고 잠재적으로 심각한 인플레이션을 피하려면 어떻게해야합니까? 이것은 하나의 이미지입니다. 사용자가 여러 프로필을 열고 캐시 된 이미지가있는 경우에는 어떻게됩니까?

답변

1

이미지 크기는 메모리 사용에 가장 큰 영향을 미칩니다. 주어진 이미지 크기 (PNG, JPG와 상관없이)의 메모리 사용량은 거의 동일하며 폭 x 높이 x 4 바이트로 표시됩니다.

3264x2448의 표지 이미지는 약 32MB로 디코딩됩니다. 아마도 원자 기록은 당신이 보는 이중화를 설명합니다.

작업해야하는 이미지의 크기 인 경우 이와 같은 스파이크가 불가피 할 수 있습니다. 중요한 것은 메모리 사용이 제한없이 증가하지 않는지 확인하는 것입니다. 앱을 실행하고 메모리 악기 게이지를 볼 때 앱이 작동 할 때 결국 성능이 저하됩니까? @autoreleasepool에 이미지 작성 코드를 래핑 해 볼 수도 있습니다.

+0

매우 도움이됩니다. 감사합니다. 내가 이상한 것을 발견하는 것은 UIImage가 NSData로 변환하는 것만 큼 많은 메모리를 차지하지 않는다는 것입니다. 귀하의 정보를 사용하고 작은 이미지를 다운로드하고 캐시하십시오. 사람들이 이미지를 탭하면 UIImage 형식으로 모든 것을 다운로드합니다. 모든 데이터는 뷰 컨트롤러가 파괴 될 때 해제되고 얼마 후에는 어쨌든 사라집니다. NSData 객체를 저장하는 백그라운드 스레드가 NSData 객체를 유지할 수 있습니까? 나는 @autoreleasepool을 시도했지만 효과가없는 것처럼 보였다. –

+0

나는 당신이보고있는 것이 지연된 로딩/디코딩이 iOS가 이미지들로하는 것이라고 생각한다. 이미지를 다운로드하고 imageWithContentsOfFile :을 사용하여 UIImage를 만들면 아무 것도 디코딩되지 않습니다 (아직). UIImageView에 이미지를 그리거나 설정하면 메모리 사용이 증가합니다. 데이터 표현을 얻는 것이 비슷한 것처럼 보입니다. 여러 프로필을 보는 사용자와 언급 한 시나리오를 시도해보십시오. 시간이 지남에 따라 어떤 종류의 메모리 사용이 표시됩니까? – azsromej

관련 문제