ios - Objective-C:强制一个类成为其他类的子类

标签 ios objective-c nskeyedarchiver nskeyedunarchiver

B是A的子类。C是A的子类。当我创建c时,我在C中的.m内执行if((self = [NSKeyedUnarchiver unarchiveObjectWithFile:…])) { }

因此,尽管我将Ch中的 super class 设置为B(这就是我想要的),但是当我从unarchiveObjectWithFile:创建C对象时,由于该对象是A的子类,所以我不能强迫它成为B的子类。解释抱歉)。

有什么解决方法吗?

换句话说:当我对属于类A的对象进行unarchiveObjectWithFile:…编码,而我又有另一个类A的子类B时,unarchiveObjectWithFile:可以作为B的子类吗? (因为B是a的子类,所以允许夹心)

最佳答案

如果我理解正确:否。

如果您存档B实例,那么在取消存档时,您将获得B实例,同样对于AC实例。

但是,用非技术语言来说,子类是其 super class 的全部内容,外加一些额外的位。您不能[*]直接或通过存档创建 super class 的实例,并使其成为其子类之一的实例-“多余的位”不存在。

高温超导

[*]在有人评论之前:是的,并非在所有情况下都绝对正确,但是您正在进入晦涩,高度专业和危险的水域。不要去那

附录

似乎您属于安全更改类别的类别:您应该能够将实例的类别更改为子类,前提是该子类没有添加任何实例变量或属性。为此,您可以使用Objective-C runtime functions:

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

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

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

关于ios - Objective-C:强制一个类成为其他类的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22734625/

相关文章:

ios - 请求开发者证书的分发配置文件

ios - AMSlideMenu 菜单的深度效果

ios - 如何在 iOS App 中集成 PayPal/Apple Pay 支付模块?

ios - dateByAddingTimeInterval中的错误

ios - 企业分发失败

ios - Objective-C:在 iOS 上使用 AVFoundation 录制视频时静音/取消静音

iphone - 控制应用程序从后台返回时何时刷新

ios - 尝试使用 NSKeyedArchiver.archiveRootObject 时,Xcode 因无法识别的选择器而崩溃

iphone - 单例不会从应用程序委托(delegate)持久化到另一个 View Controller 中

objective-c - 归档 NSMutableArray