我有一系列嵌套对象,我需要通过NSCoding协议,以便我可以将顶级对象保存到NSUserDefaults。
这是对象的结构:
'讲师'班级
'班级'班级
'学生'班
我需要将一个Instructor实例保存到NSUserDefaults或该应用程序的文档。正如您所看到的,Instructor对象持有一个数组,然后该数组将保存一个类的实例。该类对象持有学生的实例。
NSCoding协议是递归的吗?我的意思是,如果我将NSCoding协议添加到每个类,我可以保存一个Instructor对象,它会递归编码包含的对象?
解码时它会以相同的方式工作吗?我可以解码一个教师类,它会递归解码所包含的对象,因为它们也符合NSCoding协议?
我该如何设置呢?
答案 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"];
}