使用 NSKeyedArchiver 将 NSMutableArray 保存到 NSUserDefaults

Posted

技术标签:

【中文标题】使用 NSKeyedArchiver 将 NSMutableArray 保存到 NSUserDefaults【英文标题】:Saving NSMutableArray to NSUserDefaults using NSKeyedArchiver 【发布时间】:2010-10-17 02:05:29 【问题描述】:

我在检索包含自定义对象的已保存 NSMutableArray 时遇到问题。应用程序崩溃,控制台报告http://pastie.org/1226822。这是我的对象 .h 文件http://pastie.org/1226823。这是我的对象 .m 文件http://pastie.org/1226826。这是我保存数据的方法http://pastie.org/1226830。这是我检索数据http://pastie.org/1226831 的方法。提前致谢。

【问题讨论】:

刚刚试过,对我来说很好用。没有崩溃。 【参考方案1】:

已修复。我在Storing custom objects in an NSMutableArray in NSUserDefaults 使用了 Brad Larson 的代码。我认为我将数据添加回数组的方式存在问题,但它现在可以工作了。

NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"savedArray"];
if (dataRepresentingSavedArray != nil)

    NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray];
    if (oldSavedArray != nil)
            objectArray = [[NSMutableArray alloc] initWithArray:oldSavedArray];
    else
            objectArray = [[NSMutableArray alloc] init];

【讨论】:

你也可以写 objectArray = [oldSavedArray mutableCopy]【参考方案2】:

控制台告诉你整个问题。你的 Assignment 对象没有实现 方法initWithCoder:

'NSInvalidArgumentException', reason: '-[Assignment initWithCoder:]: unrecognized selector sent to instance 0x5f04090'

KeyArchiver 将调用您的类以根据解码数据初始化一个新对象。你应该使用[decoder objectForKey:YOUR_KEY];

【讨论】:

我确实实现了它。 [解码器 objectForKey:YOUR_KEY];不可用。【参考方案3】:

问题不在于 NSMutableArray 或您如何调用 NSKeyedArchiver。问题是数组中的对象本身是不可归档的。

您需要您的对象来实现 NSCoding 协议。有很多关于如何做到这一点的文档,但基本上你只需添加一个 initWithCoder: 方法来从存档中创建对象,以及一个 encodeWithCoder: 方法来将对象写入存档。小菜一碟!

【讨论】:

以上是关于使用 NSKeyedArchiver 将 NSMutableArray 保存到 NSUserDefaults的主要内容,如果未能解决你的问题,请参考以下文章

NSData 从 NSKeyedArchiver 到 NSString

在 UserDefaults 上使用 NSKeyedArchiver 时属性重置

NSKeyedArchiver 保存啥格式?

如何将 UIDocumentPickerViewController 导入限制为 .archive 文件? (NSKeyedArchiver)

如何在新版本上转换 NSKeyedArchiver 对象

NSKeyedArchiver 和 iCloud