NSCoding
あなたが望むことを正確に行います。Apple のドキュメントを読むことをお勧めしますが、使い方はかなり簡単だと思いました。クラス (およびすべての子クラス) は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;
}
エンコード時にバージョン番号を追加して、将来のバージョンでアーカイブ形式の変更を柔軟に管理できるようにすることをお勧めします。
私のクラスでは、オブジェクトをアーカイブするための便利なメソッドを追加しました。
-(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];
}
もう 1 つはアーカイブを解除するか、新しいオブジェクトを作成します。
+(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;
}
最上位オブジェクトは であるNSArray
ため、最後の 2 つのメソッドをケースに合わせて変更する必要がありますが、ボイラープレート コードのほとんどは同じです。