2012-11-27 4 views
3

메모리 경고가 수신되면 공유 NSURLCache을 지우는 것이 좋습니다. 다음과 같은 내용이 있습니다 :iOS에서 메모리 경고의 URL 캐시 지우기

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application { 
    [[NSURLCache sharedURLCache] removeAllCachedResponses]; 
} 

이 또한 불필요하게 디스크 캐시를 지울 것이라고 가정합니다.

그렇다면 메모리 캐시 만 지울 수 있습니까?

+0

이렇게 생각하지 않습니다. 이미지 캐시를 지워야합니다. –

+0

@ RajanBalana, 어떻게 이미지 캐시를 지우려면 어떻게합니까? – zt9788

+0

@ zt9788 이미지 캐시를 지우는 방법을 찾았습니까? –

답변

4

메모리 경고가있는 경우 디스크 캐시가 아닌 메모리 캐시를 지우면됩니다. removeAllCachedResponses의 문제는 둘 다 해결된다는 것입니다. 내 테스트에서 이것은 메모리 캐시를 지우는 것으로 보인다.

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application { 

    NSURLCache * const urlCache = [NSURLCache sharedURLCache]; 
    const NSUInteger memoryCapacity = urlCache.memoryCapacity; 
    urlCache.memoryCapacity = 0; 
    urlCache.memoryCapacity = memoryCapacity; 
} 

유일한 관심사는 스레딩 문제입니다. this 기사 하단에 발자국이 있습니다. 캐시가 다시 생성되는 동안 요청이 다른 스레드에서 발생할 때를 재현하여 NSURLCache 퍼지 약에 StackOverflow에 대한 권장 사항이 많이 있습니다

, 그러나, 우리는 가끔 충돌이 리드를 본 적이있다. 따라서 앱이 시작될 때 캐시를 한 번 만들고 적절한 경우 캐시를 삭제하는 것이 좋습니다.

위의 해결 방법은 캐시를 다시 만들지 않지만 동일한 문제가 여전히 발생할 수 있으므로 광범위하게 테스트하지 않았습니다.

+0

흥미 롭다. 고마워요 @ 로버트! – hpique

+0

'URLCache.shared.currentMemoryUsage'는 코드 전후에 같은 값을 주므로'memoryCapacity'를'0'으로 설정하면 동작하지 않습니다. 한편, URLCache.shared.removeAllCachedResponses()를 호출 한 후, currentMemoryUsage는 '0'으로 설정된다. – rafalkitta