我有一个自定义对象,只是继承自NSObject。它有3个成员 - 两个花车和一个NSDate
。
我的应用程序将会有一个数组,其中包含许多这些对象,我需要在运行之间保持它。我怎么能做到这一点?
我已经考虑过使用SQLite数据库了,但是我认为这有点过分,因为我做过的唯一查询就是select *
。
在理想的世界里,我想使用xml plist文件。我不确定我是否可以使用自定义对象执行此操作。我知道有一组属性列表对象,NSArray
属于该对象,但writeToFile:atomically:
仅适用于属性列表对象。
任何想法都会受到赞赏,谢谢!
答案 0 :(得分:21)
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];
}
和另一个取消归档或创建新对象:
+(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
,因此您需要修改最后两种方法,但大多数样板代码都是相同的。
答案 1 :(得分:0)
如果您想要检索对象的子集,SQLite是您的最佳选择。
如果没有,则可以选择plist格式和NSCoding。 plist要求你能够将你的自定义对象转换为plist友好的东西,然后将plist转换回你的对象,但NSCoding有点难以包裹你的头并且不能用手轻易编辑(或检查)