웹 서비스에서 정보를 다운로드하고 메모리에 캐시하는 응용 프로그램이 있습니다. 특히, 내 싱글 톤 캐시 클래스는 캐시 된 모든 데이터를 포함하는 인스턴스 변수 NSMutableDictionary *memoryDirectory
을 포함합니다. 이 캐시의 데이터를 쉽게 다시 다운로드 할 수있다, 그래서 나는 UIApplicationDidReceiveMemoryWarningNotification
를받을 때 나는 여기 스레드 안전에 대해 조금 걱정 단순히NSMutableDictionary 액세스 및 파기 스레드 안전
- (void) dumpCache:(NSNotification *)notification
{
memoryDirectory = nil;
}
를 호출 할 메소드를 호출한다. (나는 일반적으로 쓰레드에 대해 많이 알지 못하지만, 코코아의 구현에서는 훨씬 적다.) 캐시는 값이 변경 가능한 사전 인 변경 가능한 사전이므로 데이터에 액세스하는 데는 두 가지 레벨의 키가있다. 내가 캐시에 쓸 때 나는 같은 것을 할 :
- (void) addDataToCache:(NSData *)data
forKey:(NSString *)
subkey:(NSString *)subkey
{
if (!memoryDirectory)
memoryDirectory = [[NSMutableDictionary alloc] init];
NSMutableDictionary *methodDictionary = [memoryDirectory objectForKey:key];
if (!methodDictionary) {
[memoryDirectory setObject:[NSMutableDictionary dictionary] forKey:key];
methodDictionary = [memoryDirectory objectForKey:key];
}
[methodDictionary setObject:data forKey:subkey];
}
내가 언젠가 과정의 중간에, dumpCache:
가 전무 사전 외출 내가이 일을 남아있을 거라는 걱정 아무 것도하지 않는 setObject:forKey:
의 무리. 이것은 치명적인 것은 아니지만, 내가 캐시를 읽는 동안 이런 일이 발생하면 문제가 발생할 것이라고 상상할 수 있습니다.
모든 캐시 읽기 및 쓰기를 어떤 종류의 @synchronized
블록으로 래핑하는 것으로 충분합니까? 그렇다면 어떻게해야할까요? (내 dumpCache:
도 비슷하게 포장해야합니까?) 그렇지 않다면 어떻게해야 내가하고있는 일이 안전한지 확인할 수 있습니까?
어쨌든 dumpCache가 잘못되었습니다. 캐시를 없애기에 충분하지 않습니다. 당신은 오히려 그것을 해제하고 새로운 것을 다시 할당하기를 원할 것입니다. 또는 단순히 setDictionary :를 빈 사전으로 바꾸기를 원합니다. –
ARC를 사용하기 때문에 명시 적으로 해제 할 수 있다고 생각하지 않지만 빈 사전으로 설정하는 것은 쉽습니다. 그것은 if (! memoryDirectory)가 불필요하게 만들 것이고, 적어도 항상 초기화 될 것이기 때문이다. – bdesham
체크하지 않아도됩니다. 메시지를 nil로 보내는 것은 합법적입니다. –