objective-c - 无论对象类型如何,NSKeyedArchiver 都会序列化整个对象层次结构吗?

标签 objective-c nskeyedarchiver

如果我将父类(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: 方法。对象如何编码/归档的细节完全取决于该方法的实现。

因此,MammalPerson 都必须覆盖该方法来为各自的类编码特定数据,以便正确存档。

一旦他们这样做,方法调用的正常动态调度将导致在传递给 +archivedDataWithRootObject: 的对象上调用正确的方法调用。同样,这取决于对象的动态类型,而不是包含指向它的指针的变量的静态类型。

关于objective-c - 无论对象类型如何,NSKeyedArchiver 都会序列化整个对象层次结构吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33314854/

相关文章:

swift3 - 如何将字典写入文件?

ios - NSKeyedUnarchiver 不从 CoreData 数据属性解码 CLPlacemark 对象

ios - 如何针对 NSUserDefaults 使用 Touch ID?

ios - 插入新行时 TableView 滚动到中间

iphone - 使用 Interface Builder 将 TTImageView 添加到 XIB

asp.net - iOS AFNetworking - ASP.NET Web API .ASPXAUTH 存储和删除

objective-c - 使用 NSKeyedArchiver 编码大型对象图会占用内存

iphone - 如何持久化和加载一个符合NSCoding协议(protocol)的对象?

ios - UISearchController 搜索栏出现但不工作/触发

ios - 当 nscoding writeToFile 正在保存并且用户关闭应用程序时,iOS 会发生什么?