2 回答
如果我理解正确:不。
如果您归档 的实例,B
那么当您取消归档时,您将获得 的实例B
,同样适用于A
and的实例C
。
但是,在非技术语言中,子类是它的超类的所有内容加上一些额外的位。您不能 [*] 获取直接创建或通过取消归档创建的超类的实例,并将其变成其子类之一的实例——“额外位”不存在。
高温高压
[*] 在有人发表评论之前:是的,这并非在所有情况下都绝对正确,但您正在进入晦涩、高度专业化和危险的水域。不要去那里。
附录
似乎您可能属于更改对象类是安全的类别:如果子类不添加实例变量或属性,您应该能够将实例的类更改为子类。为此,您可以使用Objective-C 运行时函数:
id obj = ... some instance of class A
object_setClass(obj, [B class]); // where B is a subclass of A which adds no properties or variables
您还可以使用取消归档类来设置类。
不要随便这样做。考虑替代方案,但有时这是一个合适的解决方案。
unarchiver 想要创建与以前存档的相同类型的类,这通常也是您想要的。
您可以考虑使用setClass:forClassName:
来更改将被取消存档的类,但您迟早很有可能毁掉一切......
基于粒子评论:
另一种选择是获取超类实例并将其“包装”在您的子类实例中。因此,您可以归档和取消归档您的子类实例,它将包含超类实例。您的子类不直接响应您的任何方法都可以转发到超类实例。
通过这种方式,您有 2 个对象,但您不会篡改任何东西或依赖您不拥有的类的实现细节。