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
의 경우 케이스의 마지막 두 가지 방법을 수정해야하지만 상용구 코드의 대부분은 동일합니다.
그리고 좋은 plist를 생산할 것이라고? NSData를 작성하면 직렬화 된 데이터 만 생성되고 plist는 생성되지 않는다는 인상하에있었습니다. – Jasarien
그러면 NSCoding 아카이브가 생깁니다. 오브젝트의 복사본이 보존 된 파일로, nib 파일과 비슷합니다 (인터페이스 작성기를 사용하여 편집 할 수는 없습니다). 문서의 "Archives and Serializations Programming Guide for Cocoa"에 설명되어 있습니다. –
기본적으로 바이너리 plist에 보관하지만 원하는 경우 xml plist로 변경할 수 있습니다. 불행히도 클래스와 포인터 메타 데이터와 객체 데이터가 포함되어 있기 때문에 사람이 읽을 수있는 것은 아닙니다. –