NSKeyedUnarchiver无法解码我保存的对象

时间:2012-04-11 14:28:59

标签: objective-c ios persistence

我这样编码:

NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];          
[archiver encodeObject:data forKey:@"Object"];
[archiver finishEncoding];

然后,在从磁盘检索保存的文件后,我尝试解码它:

Object *object = (Object*)[unarchiver decodeObjectForKey:@"Object"];

问题在于它永远不会被解码回Object *类型。它仍然是NSMutableData。所以,当我尝试访问像“object.name”这样的对象的某些属性时,我得到了 - [NSConcreteMutableData name]:无法识别的选择器发送到实例0x2c8510'。

我遵循了Ray Wenderlich的教程http://www.raywenderlich.com/1914/how-to-save-your-app-data-with-nscoding-and-nsfilemanager。即使他的代码有效,但我的代码却没有。因此,经过一天的捣乱,我要求一些帮助。

2 个答案:

答案 0 :(得分:2)

您引用的教程在类上使用名为“data”的属性,在saveData方法中使用名为“data”的变量。当他调用encodeObject:时,他将属性“_data”(或至少是合成的实例变量_data)写入NSMutableData对象“data”。这有点令人困惑,因为他在两个不同的事情上使用相同的名称。

你,otoh,正在创建一个名为“data”的ivar,然后将其发送到encodeObject:。您永远不会访问您的Object *属性,只需将空NSMutableData写入NSMutableData。不同之处在于没有下划线,但有更好的方式imho。

我建议您将要编码的数据的属性重命名为“info”(或者更多信息,例如“stockPrices”或“todaysWeather”或此类存储的任何数据)

@property Object* info;

并适当地重命名您的访问者(假设您按照他的方式做事)

然后写:

[archiver encodeObject:self.info forKey:@"Object"]

为了您作为开发人员的利益,这里发生了两件事:您正在为正在编码的数据和您正在编码的信息使用不同的名称,并且您明确地使用代码表示您正在访问你的类的info属性,而不是一些局部变量。在您查看此代码后的6个月内,这两项工作都将使您的生活更轻松。

答案 1 :(得分:1)

这是因为您编码data而不是object。改变这一行:

[archiver encodeObject:data forKey:@"Object"];

到这个

[archiver encodeObject:object forKey:@"Object"];