我有一个自定义对象,只是继承自NSObject.它有3个成员 - 两个花车和一个NSDate
.
我的应用程序将有一个数组,其中包含许多这些对象,我需要在运行之间保持它.我怎么能做到这一点?
我曾经考虑过使用SQLite数据库,但我认为它有点过分,因为我做过的唯一查询就是select *
.
在理想的世界中,我想使用xml plist文件.我不确定我是否可以使用自定义对象执行此操作.我知道有一组属性列表对象,并且NSArray
属于这个对象,但writeToFile:atomically:
仅适用于属性列表对象.
任何想法将不胜感激,谢谢!
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
,您需要修改最后两种方法,但大多数样板代码都是相同的.