2012-06-05 6 views
2

, I 라인 이미지는 [있는 UIImage imageNamed는] 내 응용 프로그램에서

[UIImage imageNamed:imageName] 

을 사용했습니다. 이 기능은 나중에 사용하기 위해 이미지를 캐싱합니다. 대부분의 이미지가 두 번 이상 사용되기 때문에이 기능이 유용합니다.

하지만 메모리 경고를 시뮬레이션 할 때이 이미지에 사용 된 메모리는 해제되지 않은 것처럼 보입니다. 그리고 대부분의 메모리는 실제로 캐시 된 이미지에 사용되기 때문에 현재 불필요한 이미지가 메모리에서 해제됩니다!

-

이 예상되는 동작입니다, 또는 이미지 때문에 단지 시뮬레이션 메모리 경고 있다는 사실에 메모리에 남아 있습니까? 또는이 이미지를 공개하고 싶다면 UIImage의 이미지를 캐시하지만 메모리가 부족할 때 uneeded 이미지를 릴리스하는 자체 카테고리를 작성해야합니까 (아니면 더 좋게 만들었습니까? ??

답변

4

내가 한 일은 -initWithConentsOfFile 캐시를 사용하는 자체 캐싱 메커니즘을 만들고, 저장을 위해 NSMutableDictionary을 할당하고, 할당 된 모든 이미지는 이미지 이름을 키로하여 사전에 저장됩니다. 메모리 경고에 도달하면 사전에서 해제하고 nil하여 이미지에서 할당 된 모든 메모리를 해제 할 수 있습니다.

이렇게하면 이미지 캐싱을 완벽하게 제어 할 수 있습니다. -imageNamed:은 할당 된 메모리가 해제되는시기와 위치를 제어 할 수없는 고유 한 캐싱 메커니즘을 사용합니다.

이 방법도 시도해야합니다.

편집 : Heres는 내있는 UIImage 클래스 확장 (https://gist.github.com/2880240), 당신은 단순히 [UIImage freeCache]을 사용할 수 있습니다 경고 메모리를 받으면, 사용자 지정 캐시 -imageNamed:를 오버라이드 (override). 또한 캐시에 저장할 때 모든 이미지에 자동 복구를 설정하는 기능이 있습니다 (예 : [UIImage setShouldAutorelease:TRUE]). 기본값은 FALSE입니다.

시도해보세요. 도움이 되었으면합니다.

+0

귀하의 필요에 충분할 경우 내 대답을 정확한 것으로 표시해주십시오. :) – skram

0

이미지를 더 이상 참조 할 필요가 없으면 내부 캐싱 메커니즘에 대해 걱정할 필요가 없습니다 (어쨌든 동작이 문서화되지 않았으므로). 이미지에 대한 참조 (nil 또는 release)를 제거하기위한 코드가 있습니까?

+0

저는 ARC를 사용하고 있습니다. 그래서이 모든 것이 저에게 처리되어야한다고 생각합니까? –

+0

아직 ARC에 대한 사랑을 느끼지 못하고 있습니다. 메모리 경고에 직접 반응하고 이미지를 무효로 설정할 수 있다고 생각하십니까?또한 기억이 해방되지 않는다는 사실을 어떻게 측정하는지 궁금합니다. – Jake

+0

저는 악기를 사용하여 메모리 사용을 감시하고 있습니다. 내가 ARC가이 경우 작동하도록 이미지를 nil로 설정해야 할 수도 있습니다. 나는 곧 테스트 할 것입니다! –

0

UIImageView에서 사용하고 있습니까?

많은 프레임 워크 데이터가 앱이 백그라운드로 들어가서 자동으로 관리됩니다. imageNamed로로드 된 이미지의 데이터는 자동으로 삭제되지만 UIImageView는 데이터를 삭제하지 않으므로 메모리 부족 경고와 동일합니다.

P. 앱이 일시 중지 된 경우 메모리 경고를받지 못합니다. 그리고 많은 메모리를 사용한다면 아마 종료 될 것입니다. 이것의 가능성을 줄이려면 (메모리가 부족한 경우) NSCache에 저장 한 NSPurgeableData를 사용하여 메모리 부족 상황에서 삭제할 수있는 것으로 플래그를 지정하면 OS가이를 제거합니다.

+0

예, 슈퍼 뷰에서 표시되지 않거나 제거되지 않은 UIImageViews는 메모리를 해제하지 않는 것으로 보입니다. 내가 ARC를 사용하고 있는데, 내가 풀어주기를 원하면 ARC를 사용할 때이 imageViews를 nil로 설정해야합니까? –

+0

이렇게 보입니다. 또한 이미지가 매우 큰 경우 일반적으로 배경으로 이동하기 전에 이미지를 제거해야합니다. 그러나 이미지 압축을 풀면 시간이 오래 걸릴 수 있습니다. 결정하기 위해 응용 프로그램의 프로필을 작성해야합니다. 로드 된 이미지 등을 제거하면 종료 상태에서 앱을 시작하는 것처럼 비싸지 만 백그라운드에서 다시 시작하면 앱이 일시 중지되는 시점이 없습니다. – Gruntcakes

관련 문제