如果我将超类对象传递给-archivedDataWithRootObject:
,但该对象包含所述超类的子类;是否将整个对象图序列化为包含子类的实例变量或仅包含与超类相关的实例变量?
示例:
@interface Mammal : NSObject
@property (nonatomic, copy) NSString *species;
@end
@interface Person : Mammal
@property (nonatomic, copy) NSString *name;
@end
Person *person = [[Person alloc] init];
person.species = @"Human";
person.name = @"Michael";
Mammal *mammal = person;
NSData *personData = [NSKeyedArchiver archivedDataWithRootObject:mammal];
未归档的数据是否只包含Mammal实例变量?
答案 0 :(得分:3)
首先,编译后,保存对象指针的变量的静态类型无关紧要 。也就是说,mammal
变量被声明为指向Mammal
的事实仅在编译时用于检查内容。这个事实在编译的程序中不存在,并且不会影响运行时的行为。
其次,NSKeyedArchiver
和+archivedDataWithRootObject:
方法都不知道如何归档传入的对象。它们依赖于知道如何归档自身的对象。对象必须是符合NSCoding
协议的类型。它的类必须实现-encodeWithCoder:
方法。对象如何编码/存档的细节完全取决于该方法的实现。
因此,Mammal
和Person
都必须覆盖该方法以对相应类的特定数据进行编码,以便正确存档。
一旦他们这样做,方法调用的正常动态调度将导致在传递给+archivedDataWithRootObject:
的对象上调用正确的调用。同样,这取决于对象的动态类型,而不是保存指针的变量的静态类型。