11

我有一系列嵌套对象需要通过 NSCoding 协议,以便我可以将顶级对象保存到 NSUserDefaults 中。

这是对象的结构:

“导师”班

  • NSMutableArray 包含...的实例

“类”类

  • NSMutableArray 包含...的实例

“学生”班

  • 名称属性
  • Number 属性
  • 金钱财产

我需要将 Instructor 的实例保存到 NSUserDefaults 或应用程序的文档中。如您所见, Instructor 对象持有一个数组,该数组随后持有一个类的实例。该类对象正在保存学生的实例。

NSCoding 协议是递归的吗?我的意思是,如果我将 NSCoding 协议添加到每个类,然后我可以保存一个 Instructor 对象,它会递归地对包含的对象进行编码?

那么它在解码时会以同样的方式工作吗?我可以只解码一个讲师课程,它会递归解码包含的对象,因为它们也符合 NSCoding 协议?

我该如何设置呢?

4

2 回答 2

18

是的,您可以(并且可能应该)编写对 NSCoding 递归的支持。这就是 NSCoding 应该如何工作的。

当您实现 encodeWithCoder 时,只需调用

[coder encodeObject: aProperty forKey: @"propertyName"];

在所有对象的属性上,包括它的容器属性。

然后确保对象的对象图中的每个对象也符合 NSCoding。

对于标量属性,您可以使用 NSCoder 方法(如 encodeInt:forKey)保存标量值:

要将符合 NSCoding 的对象保存为用户默认值,首先使用 NSKeyedArchiver 类方法 archivedDataWithRootObject 将其转换为 NSData,然后将结果数据保存为默认值。很简单,真的。

于 2013-09-25T19:42:15.313 回答
3

NSCoding不是魔术,因此如果您的编码和解码方法的实现告诉它,它将“递归”工作。

实现NSCoding方法并将要编码的数据传递给编码器。在所有自定义类中实现这些 NSCoding方法,以便在对数组进行编码时可以适当地处理所有内容。

super如果类超类也实现了,请务必调用NSCoding

例如

- (void)encodeWithCoder:(NSCoder *)encoder {
    [encoder encodeObject:self.arrayOfClasses forKey:@"arrayOfClasses"];
}

- (id)initWithCoder:(NSCoder *)decoder {
    self.arrayOfClasses = [decoder decodeObjectForKey:@"arrayOfClasses"];
}
于 2013-09-25T19:10:22.547 回答