在Objective-C中将对象类型转换为子类对象类型

在Objective-C中将对象类型转换为子类对象类型,objective-c,subclass,dynamic-typing,Objective C,Subclass,Dynamic Typing,假设我有类A和类B。类B是类A的一个子类。类A包含一些属性,然后类B通过添加特定于该子类的附加属性来扩展类A超类。我已经创建了一个Class a对象,现在希望在运行时将该对象转换为Class B类型的对象,这样我就可以将数据添加到Class B提供的附加属性中。在Objective-C中有什么方法可以做到这一点吗?谢谢 为什么不为类B编写一个构造函数,将类a作为参数,并具有类B所需的附加属性 你为什么不先创建一个B类呢?你想这么做听起来确实有点奇怪。也许您可以给我们一些关于类A和B的更具体的细节

假设我有类A和类B。类B是类A的一个子类。类A包含一些属性,然后类B通过添加特定于该子类的附加属性来扩展类A超类。我已经创建了一个Class a对象,现在希望在运行时将该对象转换为Class B类型的对象,这样我就可以将数据添加到Class B提供的附加属性中。在Objective-C中有什么方法可以做到这一点吗?谢谢

为什么不为类B编写一个构造函数,将类a作为参数,并具有类B所需的附加属性


你为什么不先创建一个B类呢?你想这么做听起来确实有点奇怪。也许您可以给我们一些关于类A和B的更具体的细节,以及您对它们所做的操作。

您无法将其转换到位,因为类B的实例比类A的实例大(假设附加属性存储在IVAR中)。Objective-C无法重新定位对象

如果您很乐意创建对象的副本(即,您确定没有对它的引用或可以更新它们),您可以使用以下方法执行类似操作:


最简单的方法是替换类A上的alloc以实际返回类B

@implementation ClassA (MyCategory)

+ (id)alloc
{
    if (self != [ClassB class])
        return [ClassB alloc];
    return [super alloc];
}

@end

当然,这样做通常是一个非常糟糕的主意。

这是危险的;您真的不应该这样做。请注意,如果任何内容引用了,则该引用现在将无效。此习惯用法的一个示例是
[NSMutableArray arrayWithArray:someArray]
@implementation ClassA (MyCategory)

+ (id)alloc
{
    if (self != [ClassB class])
        return [ClassB alloc];
    return [super alloc];
}

@end