2011-05-09 4 views
1

내가 처음으로 키 입력 아카이버 클래스를 사용하려고 시도하고 있는데이 간단한 테스트 (OCUnit)의 마지막 어설 실패 해요 : 나는 아카이버가 보관되어 있음을 확인했다encodeRootObject를 사용하여 보관 된 항목을 보관 취소하는 올바른 방법은 무엇입니까?

- (void) testNSCoding 
{ 
    NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:5]; 
    [dict setObject:@"hello" forKey:@"testKey"]; 

    NSMutableData* data = [NSMutableData data]; 
    NSKeyedArchiver *ba = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
    [ba encodeRootObject:dict]; 
    [ba finishEncoding]; 

    STAssertTrue(data.length != 0, @"Archiver gave us nothing."); 

    NSKeyedUnarchiver *bua = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; 
    id decodedEntity = [bua decodeObjectForKey:@"root"]; 
    [bua finishDecoding]; 
    STAssertNotNil(decodedEntity, @"Unarchiver gave us nothing."); 
} 

, 난 문제가 보관되지 않았다고 가정합니다. Archives and Serializations Guide에 따르면 나는 Unarchiver를 어떻게 사용하고 있는지에 대해 약간의 문제가있을 것이라고 생각합니다.

감사합니다.

답변

1

encodeRootObject 메서드를 사용하면 안됩니다. 이는 쓸모없는 키가없는 보관 기능을 지원하기 위해 NSCoder에 정의 된 기존 방법이며 decodeObject:을 사용해서 만 디코딩 할 수 있습니다. encodeObjectForKey:decodeObjectForKey: 쌍만 사용하십시오. 당신이 대신

[ba encodeRootObject:dict]; 

의, 사전의 전체를 해독하려면

id decodedEntity = [bua decodeObjectForKey:@"root"]; 

id decodedEntity = [bua decodeObjectForKey:@"testKey"]; 

해야

그래서,

[ba encodeObject:dict forKey:@"root"]; 

단순한 목적으로는 NSUserDefaults을 사용하는 것으로 충분합니다. NSUserDefaults은 자동으로 파일을 작성하고, 파일에 쓰고, 다음에 프로그램을 시작할 때 읽는 것을 자동으로 처리합니다.

사전을 인코딩해야한다면 일반적으로 NSPropertyListSerialization을 사용하면됩니다.

NSKeyedArchiverNSKeyedUnarchiver을 사용하는 경우 연습을 수행하고 개체에 encodeWithCoder:initWithCoder:을 작성하는 것이 좋습니다.

+0

죄송 합니다만, "hello"문자열을 가져 오지 않으려 고합니다. 사전을 가져 오려고합니다. 위의 링크 된 페이지 하단에 귀하의 질문에 대답 : archiveRootObject : toFile :를 사용하여 이전에 생성 된 아카이브에 대한 아카이브 해제 프로세스를 사용자 정의하려는 경우 decodeObjectForKey : 및 키 "루트"를 사용하여 아카이브. –

+0

NSUserDefaults에 대한 정보를 제공해 주셔서 감사합니다. 이 테스트는 내가 쓰고있는 훨씬 더 복잡한 산세 하위 시스템을위한 것입니다. NSUserDefaults로는 충분하지 않습니다. –

+0

음,하지만 당신은'archiveRootObject : toFile :'을 사용하지 않았습니까? – Yuji

0
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    id profileData = [defaults dataForKey:kProfileDataKey]; // or you can get it from the web 
    if (profileData && [profileData isKindOfClass:[NSData class]]) { 
     NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:(NSData *)profileData]; 
     unarchiver.requiresSecureCoding = YES; // <NSSecureCoding> 
     id object = [unarchiver decodeObjectOfClass:[MyClass class] forKey:NSKeyedArchiveRootObjectKey]; 
     NSLog(@"%@", object); 
    }