NSCoding
tam olarak ne istediğinizi yapacağız. Apple belgelerinde okumayı öneririm, ancak kullanımı oldukça kolay olduğunu düşündüm. Sınıfınız (ve herhangi bir çocuk sınıfının) NSCoding
protokolünü uygulamalıdır ve nesnelerinize -encodeWithCoder:
ve -initWithCoder:
yöntemlerini eklemeniz gerekir. Ortak çerçeve sınıflarının çoğu zaten NSCoding
uygular.
sınıfınız için kodu şöyle görünecektir: Bu önerilir
-(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;
}
size gelecekteki sürümlerinde Arşiv formatına değişiklikleri yönetmek için esneklik sağlamak için kodlama yaparken bir sürüm numarası ekleyin. En üst düzey nesne bir olduğundan
+(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;
}
: arşivden veya yeni bir nesne oluşturmak için
-(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];
}
ve bir tane daha: Benim sınıfımda
, benim nesneyi arşivlemek için bir kolaylık yöntemi eklendi NSArray
, sizin durumunuz için son iki yöntemi değiştirmeniz gerekir, ancak çoğu ortak kod aynı olacaktır.
Ve bu hoş bir plist üretecek? NSData'nın yazılmasının sadece bir veri tabanı üretmeyeceği ve bir plist oluşturmayacağı izleniminin altındaydım. – Jasarien
Bu, bir NSCoding arşivi oluşturur — nesnelerinizin korunmuş kopyalarını içeren bir dosya, bir nib dosyası gibi (ancak bunu düzenlemek için Interface Builder kullanamazsınız). Belgelerinizdeki "Kakao için Arşivler ve Seri Numarası Programlama Rehberi" açıklayacaktır. –
Varsayılan olarak ikili bir plist'e arşivlenir, ancak isterseniz bunu bir xml plist'e dönüştürebilirsiniz. Ne yazık ki sınıf ve işaretçi meta verilerinin yanı sıra nesne verilerinizi içerdiği için gerçekten okunabilir değildir. –