使用嵌套自定义对象进行NSCoding?

时间:2013-09-25 19:07:54

标签: iphone ios objective-c nscoding

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

这是对象的结构:

'讲师'班级

  • 包含......
  • 实例的NSMutableArray

'班级'班级

  • 包含......
  • 实例的NSMutableArray

'学生'班

  • 名称属性
  • 号码属性
  • Money Property

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

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

解码时它会以相同的方式工作吗?我可以解码一个教师类,它会递归解码所包含的对象,因为它们也符合NSCoding协议?

我该如何设置呢?

2 个答案:

答案 0 :(得分:17)

是的,您可以(并且可能应该)将您对NSCoding的支持写为递归。这就是NSCoding的工作方式。

当您的工具为encodeWithCoder时,只需调用

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

关于所有对象的属性,包括它的容器属性。

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

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

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

答案 1 :(得分:3)

NSCoding不是神奇的,所以它会以递归的方式运作'如果你的编码和解码方法的实现告诉它。

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

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

e.g。

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

- (id)initWithCoder:(NSCoder *)decoder {
    self.arrayOfClasses = [decoder decodeObjectForKey:@"arrayOfClasses"];
}