gpt4 book ai didi

objective-c - 持久化自定义对象

转载 作者:太空狗 更新时间:2023-10-30 03:25:33 25 4
gpt4 key购买 nike

我有一个简单地继承自 NSObject 的自定义对象。它有 3 个成员 - 两个 float 和一个 NSDate

我的应用程序将有一个包含大量此类对象的数组,我需要在运行之间保留它。我怎样才能做到这一点?

我考虑过使用 SQLite 数据库,但我认为这有点矫枉过正,因为我做过的唯一查询是 select *

在理想情况下,我想使用 xml plist 文件。我不确定我是否可以用我的自定义对象来做到这一点。我知道有一组属性列表对象,NSArray 位于其中,但 writeToFile:atomically: 仅适用于属性列表对象。

任何想法将不胜感激,谢谢!

最佳答案

NSCoding 会做你想做的。我建议您在 Apple 文档中仔细阅读它,但我认为它使用起来非常简单。您的类(和任何子类)将需要实现 NSCoding 协议(protocol),并且您需要添加 -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;
}

建议您在编码时添加版本号,以便您可以灵活地管理 future 版本中对存档格式的更改。

在我的类(class)中,我添加了一个方便的方法来归档我的对象:

-(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,您需要根据您的情况修改最后两个方法,但大部分样板代码都是相同的。

关于objective-c - 持久化自定义对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/648143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com