2009-03-15 6 views
10

NSObject에서 단순히 상속되는 사용자 지정 개체가 있습니다. 그것에는 2 명의 선수와 NSDate의 3 명의 일원이있다.사용자 지정 개체 유지

내 응용 프로그램에는 이러한 개체가 여러 개있는 배열이있을 것이므로 실행간에 유지해야합니다. 이것을 어떻게 할 수 있습니까?

나는 SQLite db를 사용하는 것에 대해 생각해 봤지만, 나는 이제까지 할 유일한 쿼리가 select *이 될 것이므로 약간 과잉이라고 생각합니다.

이상적인 세계에서 xml plist 파일을 사용하고 싶습니다. 그래도 내 사용자 지정 개체로이 작업을 수행 할 수 있는지 확실하지 않습니다. 속성 목록 개체 집합이 있다는 것을 알고 있으며 그 아래에 NSArray이 들어 있지만 writeToFile:atomically:은 속성 목록 개체에서만 작동합니다.

의견을 보내 주셔서 감사합니다.

답변

21

NSCoding 정확히 원하는대로 할 것입니다. Apple docs에서이 기사를 읽으시기를 권해 드리고 싶지만 사용하기에 꽤 간단하다고 생각했습니다. 수업 (및 하위 클래스)은 NSCoding 프로토콜을 구현해야하며 객체에 -encodeWithCoder:-initWithCoder: 메쏘드를 추가해야합니다. 대부분의 공통 프레임 워크 클래스는 이미 NSCoding을 구현합니다.

클래스의 코드는 다음과 같이 보일 것입니다 : 그것은 권장

-(void) encodeWithCoder: (NSCoder*) coder { 
    [coder encodeInteger: versionValue forKey: versionKey]; 
    [coder encodeObject: myStuff forKey: myStuffKey]; 
} 

-(id) initWithCoder: (NSCoder*) coder { 
    self = [super init]; 
    if (! self) return nil; 
    myStuff = [[coder decodeObjectForKey: myStuffKey] retain]; 
    return self; 
} 

당신에게 향후 버전에서 아카이브 형식에 대한 변경 사항을 관리 할 수있는 유연성을 제공 인코딩 할 때 버전 번호를 추가합니다. 최상위 레벨의 객체가를하기 때문에

+(MyArchive*) newFromFile: (NSString*) path 
      orWithMyStuff: (MyStuff*) myStuff 
{ 
    NSData *data = [[NSData alloc] initWithContentsOfFile: path]; 
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData: data]; 
    MyArchive *myArchive = [unarchiver decodeObjectForKey: myArchiveKey]; 
    [unarchiver finishDecoding]; 

    if (myArchive) { 
    [myArchive retain]; 
    } else { 
    myArchive = [[MyArchive alloc] initWithStuff: myStuff; 
    } 
    [unarchiver release]; 
    [data release]; 
    return myArchive; 
} 

: 보관 해제하거나 새로운 개체를 만드는 데

-(void) archiveToFile: (NSString*) path { 
    NSMutableData *data = [[NSMutableData alloc] init]; 
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData: data]; 
    [archiver encodeObject: self forKey: myArchiveKey]; 
    [archiver finishEncoding]; 
    [archiver release]; 
    [data writeToFile: path atomically: YES]; 
    [data release]; 
} 

다른 하나를 내 수업에서

, 내 객체를 보관하는 편리한 방법을 추가 NSArray의 경우 케이스의 마지막 두 가지 방법을 수정해야하지만 상용구 코드의 대부분은 동일합니다.

+0

그리고 좋은 plist를 생산할 것이라고? NSData를 작성하면 직렬화 된 데이터 만 생성되고 plist는 생성되지 않는다는 인상하에있었습니다. – Jasarien

+0

그러면 NSCoding 아카이브가 생깁니다. 오브젝트의 복사본이 보존 된 파일로, nib 파일과 비슷합니다 (인터페이스 작성기를 사용하여 편집 할 수는 없습니다). 문서의 "Archives and Serializations Programming Guide for Cocoa"에 설명되어 있습니다. –

+0

기본적으로 바이너리 plist에 보관하지만 원하는 경우 xml plist로 변경할 수 있습니다. 불행히도 클래스와 포인터 메타 데이터와 객체 데이터가 포함되어 있기 때문에 사람이 읽을 수있는 것은 아닙니다. –

0

개체의 하위 집합을 검색하려는 경우 SQLite가 최선의 선택입니다.

그렇지 않은 경우 plist 형식과 NSCoding 사이의 선택입니다. plist는 사용자 지정 개체를 plist-friendly 한 것으로 변환 한 다음 plist를 개체로 다시 변환 할 수 있어야하지만 NSCoding은 머리를 감싸기가 조금 더 어려워 손으로 쉽게 편집 (또는 검사) 할 수 없습니다 .

+0

하위 집합을 사용하지 않습니다. 난 그냥 전체 목록을 유지해야합니다. 개체를 plist friendly로 변환하는 방법은 무엇입니까? Property List Objects (속성 목록 개체)가 있다는 사실을 이해했습니다. 내 개체가 plistable되지 않은 아무것도 만들어지지 않습니다 ... – Jasarien

관련 문제