2014-04-18 2 views
0

NSDictionary 데이터 키에 허용되는 최대 크기는 얼마입니까? 즉 :NSDictionary 데이터 키의 최대 크기

256 바이트, 1024 바이트 등

+3

'NSDictionary'의 키 id' '타입의 객체 - 항목이다. 그들은 포인터로 저장되며 실제로 "크기"가 없습니다. 어떤 종류의 객체를 키로 사용하려고합니까? – bdesham

+0

나는 plist 내의 작은 그래픽과 같은 이진 데이터를 저장하고 필요에 따라 저장하고 싶습니다. – user3549620

+0

@ user3549620 귀하의 의견을 토대로, 왜 당신이 정말로 가치에 대해 알고 싶어하는 것 같아 키에 대한 질문입니까? – rmaddy

답변

0

있는 NSDictionary 키 바이트에는 최대 크기 제한이 없습니다.

아마도 NSDictionary 값의 최대 한도에 대해 물어 본다는 경우 해당 제한이 없습니다.

NSDictionary의 키의 고유성은 hash NSObject의 메서드로 결정됩니다.

업데이트 :

당신이 다음 이중 계층 접근 방식은 당신을 위해 작동 할 수 있습니다 귀하의 데이터를 유지하려면 그와 함께 사전 접근 견뢰도와 함께 이익을 얻고 싶다면. 이 접근법에서;

먼저 데이터는 NSMutableDictionary에 저장되고 백그라운드에서 plist 파일로 푸시됩니다. 이런 식으로 보입니다.

.H 파일에서

,이 방법을 사용

NSMutableDictionary *userDictionary;

그런 다음하는 .m 파일에서이 같은 방법을 정의

- (void)storeValue:(id)value forKey:(id)key { 
    [userDictionary setValue:value forKey:key]; 
    [self commitIntoPlist]; 
} 

-(id)getValueForKey:(NSString *)key{ 
    return [userDictionary objectForKey:key]; 
} 

- (void)removeObjectForKey:(NSString *)key { 
    [userDictionary removeObjectForKey:key]; 
    [self commitIntoPlist]; 
} 

//commit the data into plist 
- (void)commitIntoPlist { 
    dispatch_once(&onceCommitToken, ^{ 
     commitQueue = dispatch_queue_create([@"com.yourappname.commit" cStringUsingEncoding:NSUTF8StringEncoding], DISPATCH_QUEUE_CONCURRENT); 
    }); 
    dispatch_async(commitQueue, ^{ 
     //here write the dictionary into plist 
     [self writeDictionaryIntoPlistFile:userDictionary]; 
     }); 
} 

당신이 사전과 지속성의 속도를 얻을 선언 함께 Plist의. 이 클래스를 싱글 톤으로 유지하고 사용하기 전에 NSMutableDictionary을 할당하는 것을 잊지 마십시오.

+0

주요 관심사는 앞서 언급 한 내용이며 Apples Documentation에서 "많은 양의 이진 데이터를 저장하기 위해 속성 목록에서 데이터 개체를 사용하지 않는 것이 가장 좋습니다"라고 말합니다. 그들은 "커다란"것으로 무엇을 정의합니까? 1MB, 100GB, 1TB? – user3549620

+0

NSDictionary가 plist 파일과 같지 않습니다. 따라서 NSDictionary에 큰 바이너리 데이터를 유지하는 것은 성능을 저하시키지 않습니다. 메신저 배경 스레드에 plist에 큰 데이터를 저장하는 유사한 방법을 사용합니다. 나는 나의 대답을 업데이트 할 것이다. – Selvin

+0

좋은 예입니다. 전에 디스패치 대기열을 사용 했으므로 의미가 있습니다. NSDictionary에서 읽은 항목에 대해 디스패치 대기열을 사용하는 것 외에 버퍼를 생성해야합니까? 단지 호기심. – user3549620

0

NSDictionary의 키와 값은 id의 개체 항목입니다. 그것들은 내부적으로 포인터로 저장되며 고정 된 크기입니다. NSDictionary에 넣을 수있는 "너무 큰"개체가 없습니다.

(당신이 PLIST에 사전을 직렬화 할 경우에는 사전은 the data types that can be serialized for you를 보유하고 있는지 확인해야합니다.)

+0

데이터를 직렬화하는 것이 더 좋으며 고정 된 크기는 무엇을 의미합니까? – user3549620

0

있는 NSDictionary의 일이 오브젝트해야합니다. 객체는 항상 값이 아니라 참조에 의해 저장되기 때문에 객체의 크기는 전혀 중요하지 않습니다.

임의의 데이터를 Foundation 컬렉션에 저장해야하지만 개체 래퍼가 유용하지 않다고 생각하면 일반적으로 NSValue 및 NSData가 최선의 방법입니다.

+0

알아두면 좋을 것 같습니다. 내 관심은 예를 들어 100KB의 객체를 저장하면 액세스 할 때 메모리 문제가 발생할 수 있다는 것입니다. – user3549620

1

크기 제한 없습니다 자체 NSDictionary의 키 또는 값에, 다른 사람들이 키와 값 객체에 대한 참조 만 지적으로 저장 및 참조는 일반적으로 4 또는 8 바이트된다. 개체의 크기는 기본적으로 (가상) 메모리의 크기에 의해 제한됩니다.

그러나 귀하의 의견에 명시된 바와 같이, 귀하의 실제 질문이 아닙니다. 오히려 성능 문제를 일으키지 않고 사전의 디스크 표현에 대한 크기에 대해 우려하고 있습니다. 매우 큰 파일을 메모리로 읽는 데는 많은 메가 바이트를 쉽게 읽을 수 있고 사전의 몇 가지 "작은 그래픽"은 문제가되지 않습니다.

plist를 사용하는 것이 최선의 선택이 아닙니다. 이들은 매우 제한된 데이터 유형의 일련 화 표현이며, 예를 들어 NSImage은 그 중 하나가 아니며 다른 용도에 더 적합합니다. 대신에 표준 Cocoa 보관 클래스를 살펴 봐야합니다.이 클래스는 NSCoding을 구현하는 모든 클래스를 처리하며 컬렉션 (NSDictionary, NSArray 등) 및 이미지를 포함하여 많은 표준 클래스를 수행합니다. Archives and Serializations Programming Guide 읽기

HTH

+0

흥미 롭습니다. 특히 NSImage에 대해 언급 한 내용이 흥미 롭습니다. 이전에 파일에서 NSImage로만 데이터를 읽었 기 때문에 파일에서 읽는 것처럼 데이터 문자열에 액세스 할 수있는 방법이 없다고 가정합니다. 상상할 수있는 정보를 바탕으로 몇 가지 가능성을 다시 생각해야합니다. – user3549620

관련 문제