1
4

2 回答 2

4

如果我理解正确:不。

如果您归档 的实例,B那么当您取消归档时,您将获得 的实例B,同样适用于Aand的实例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

您还可以使用取消归档类来设置类。

不要随便这样做。考虑替代方案,但有时这是一个合适的解决方案。

于 2014-03-29T18:01:41.423 回答
1

unarchiver 想要创建与以前存档的相同类型的类,这通常也是您想要的。

您可以考虑使用setClass:forClassName:来更改将被取消存档的类,但您迟早很有可能毁掉一切......


基于粒子评论:

另一种选择是获取超类实例并将其“包装”在您的子类实例中。因此,您可以归档和取消归档您的子类实例,它将包含超类实例。您的子类不直接响应您的任何方法都可以转发到超类实例。

通过这种方式,您有 2 个对象,但您不会篡改任何东西或依赖您不拥有的类的实现细节。

于 2014-03-29T18:02:35.203 回答