我有一个简单地继承自 NSObject 的自定义对象。它有 3 个成员 - 两个花车和一个NSDate
.
我的应用程序将有一个数组,其中包含许多这些对象,并且我需要在运行之间保留它。我怎样才能做到这一点?
我考虑过使用 SQLite 数据库,但我认为这有点矫枉过正,因为我做过的唯一查询是select *
.
在理想的情况下,我想使用 xml plist 文件。我不确定我是否可以用我的自定义对象来做到这一点。我知道有一组属性列表对象,并且NSArray
属于这个范围,但是writeToFile:atomically:
仅适用于属性列表对象。
任何想法将不胜感激,谢谢!
NSCoding
会做你想做的事。我建议您阅读 Apple 文档,但我认为它使用起来非常简单。您的班级(以及任何子班级)将需要实施NSCoding
协议,你需要添加-encodeWithCoder:
and -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
,您需要根据您的情况修改最后两个方法,但大多数样板代码将是相同的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)