如果我将父类(super class)对象传递给 -archivedDataWithRootObject:
,但该对象包含所述父类(super class)的子类;整个对象图将被序列化以包含子类的实例变量还是仅包含与父类(super class)相关的实例变量?
例子:
@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
变量被声明为指向 Mammal
的指针这一事实仅在编译时用于检查内容。这个事实不会在编译程序中存在,也不会影响运行时的行为。
其次,NSKeyedArchiver
及其+archivedDataWithRootObject:
方法都不知道如何归档传入的对象。它们依赖于知道如何归档自身的对象。对象必须是符合 NSCoding
协议(protocol)的类型。它的类必须实现 -encodeWithCoder:
方法。对象如何编码/归档的细节完全取决于该方法的实现。
因此,Mammal
和 Person
都必须覆盖该方法来为各自的类编码特定数据,以便正确存档。
一旦他们这样做,方法调用的正常动态调度将导致在传递给 +archivedDataWithRootObject:
的对象上调用正确的方法调用。同样,这取决于对象的动态类型,而不是包含指向它的指针的变量的静态类型。
关于objective-c - 无论对象类型如何,NSKeyedArchiver 都会序列化整个对象层次结构吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33314854/