嵌套自定义对象的NSCoding?

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

这里是对象的结构:

“导师”class

  • NSMutableArray持有的实例…

'class'级

  • NSMutableArray持有的实例…

'学生'class

  • 名称属性
  • 数字属性
  • 货币财产

我需要将教师的实例保存到NSUserDefaults或应用程序的文档。 正如你所看到的教师对象是持有一个数组,然后举行一个类的实例。 那个类对象持有学生的实例。

NSCoding协议是否recursion? 我的意思是,如果我将NSCoding协议添加到每个类,然后我可以保存一个教师对象,它会recursion编码包含的对象?

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

我怎么能设置这个呢?

是的,你可以(也可能应该)写你对NSCoding的支持是recursion的。 这就是NSCoding应该如何工作。

当你的工具encodeWithCoder,只需调用

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

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

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

对于标量属性,可以使用像encodeInt:forKey这样的NSCoder方法保存标量值:

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

NSCoding不是神奇的,所以如果你的编码和解码方法的实现告诉它,它将“recursion地”工作。

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

如果类超类也实现了NSCoding一定要调用super

例如

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