0

我这样编码:

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]: unrecognized selector sent to instance 0x2c8510'。

我遵循了 Ray Wenderlich 的教程http://www.raywenderlich.com/1914/how-to-save-your-app-data-with-nscoding-and-nsfilemanager。尽管他的代码有效,但我的却不行。因此,在搞砸了一天之后,我正在寻求帮助。

4

2 回答 2

2

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

您,otoh,正在创建一个名为“data”的 ivar,然后将其发送到 encodeObject:。你永远不会访问你的 Object* 属性,只是将一个空的 NSMutableData 写入 NSMutableData。区别在于缺少下划线,但恕我直言,有更好的方法。

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

@property Object* info;

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

然后写:

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

作为开发人员,为了您的利益,这里发生了两件事:您正在为正在编码的数据和正在编码的信息使用不同的名称,并且您正在明确编写代码,表明您正在访问您的班级信息属性,而不是一些局部变量。从现在起 6 个月后,当您查看此代码时,这两者都会让您的生活更轻松。

于 2012-04-11T14:48:19.230 回答
1

这是因为你data没有编码object。更改此行:

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

对此

[archiver encodeObject:object forKey:@"Object"];
于 2012-04-11T14:41:40.670 回答