2011-04-11 5 views
2

NSMutableDictionary에 사용자 지정 개체를 저장하려고합니다. NSMutableDictionary에서 객체를 읽을 때 저장하면 항상 null입니다. 여기NSMutableDictionary에 사용자 지정 개체 저장

는 저장 코드

//입니다

NSString *filePath = [self dataFilePath]; 
     NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath]; 

     CustomObject *tempObj = [dict objectForKey:@"FirstObjectKey"]; 

     NSLog(@"Object %@", tempObj); 
     NSLog(@"property1:%@,,tempObj.property1); 

가 어떻게 NSMutableDictionary에서 사용자 정의 클래스 객체를 저장할 수 읽기

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 

CustomObject *obj1 = [[CustomObject alloc] init]; 
obj1.property1 = @"My First Property"; 

[dict setObject:obj1 forKey:@"FirstObjectKey"]; 
[dict writeToFile:[self dataFilePath] atomically:YES]; 

//?

+0

NSLog 출력은 무엇을 말합니까? 그리고 파일을 읽으면 개체가 올바르게 기록되는지 확인할 수 있습니까? – alesplin

+0

2011-04-11 19 : 31 : 14.386 지속성 [1757 : 207] 개체 (null) 2011-04-11 19 : 31 : 14.388 지속성 [1757 : 207] 속성 1 : (null) – Leo

+0

'- [NSDictionary writeToFile : atomically :]'는'BOOL'를 반환합니다. 결과를 확인하는 것이 발생 했습니까? –

답변

2

writeToFile 방법은 표준 유형의 개체 만 plist에 저장할 수 있습니다. 사용자 지정 개체가있는 경우 NSKeyedArchiver/NSKeyedUnarchiver을 사용해야합니다.

+0

안녕하세요 Eimantas, NSKeyedArchiver 접근 방식을 구현했으며 이제 사용자 지정 개체를 저장할 수 있습니다. 제 질문은 nsdictionary와 같이 사용할 수 있습니까? NSDictionary에는 모든 키를 가져 오는 함수가 내장되어 있으므로 에뮬레이션 할 수 있습니다. 보관 된 객체를 열거 할 수 있습니까? – Leo

+0

사전에 객체를 보관하지 않으면 (writeToFile 대신 encodeWithCoder 사용). – Eimantas

7

문제는 사전에 개체를 넣는 것이 아닙니다. 문제는 그것을 파일에 쓰는 것입니다.

사용자 정의 클래스는 serializable이어야합니다. NSCoding protocol을 구현하여 Cocoa가 클래스에 디스크에 쓰도록 요청할 때 클래스와 함께해야 할 것을 알고 있어야합니다.

이것은 매우 간단합니다. 기본적으로

- (id)initWithCoder:(NSCoder *)coder { 
    self = [super init]; 
    // If inheriting from a class that implements initWithCoder: 
    // self = [super initWithCoder:coder]; 
    myFirstIvar = [[coder decodeObjectForKey:@"myFirstIvar] retain]; 
    mySecondIvar = [[coder decodeObjectForKey:@"mySecondIvar] retain]; 
    // etc. 

    return self; 
} 

- (void)encodeWithCoder:(NSCoder *)coder { 
    // If inheriting from a class that implements encodeWithCoder: 
    // [super encodeWithCoder:coder]; 
    [coder encodeObject:myFirstIvar forKey:@"myFirstIvar"]; 
    [coder encodeObject:mySecondIvar forKey:@"mySecondIvar"]; 
    // etc. 
} 

그냥 제대로 다시 읽기 다음 저장하는 데 필요한 인스턴스 변수를 나열하고있어 : 당신은 다음과 같이 보일 것 두 가지 방법을 구현해야합니다.

업데이트 : Eimantas에서 언급했듯이 NSKeyedArchiver도 필요합니다. 저장하려면 :

NSData * myData = [NSKeyedArchiver archivedDataWithRootObject:myDict]; 
BOOL result = [myData writeToFile:[self dataFilePath] atomically:YES]; 

는 다시로드하려면 :

NSData * myData = [NSData dataWithContentsOfFile:[self dataFilePath]]; 
NSDictionary * myDict = [NSKeyedUnarchiver unarchiveObjectWithData:myData]; 

내가 그 그것을한다고 생각합니다.

+0

안녕하세요 Josh, NSCoding을 구현했지만 사전에 개체를 저장할 수 없습니다. 마이크가 언급 한 것처럼 필자는 파일 쓰기 결과를 확인하고 결과는 "아니오"입니다. 어떤 생각? – Leo

+0

@ 레오 : 맞아, 미안해. Eimantas는 당신이 필요로하는 나머지 절반 인 NSKeyedArchiver를 언급했습니다. 나는 그 부분을 포함하도록 나의 대답을 업데이트했다. –

관련 문제