ios 子类化错误转换子类

ios subclassing error casting subclass

我有一个 nsobject 的 Widget class,它有一些属性和一些方法,然后我有一个 Widget subclass 叫做 Gallery,这个 class 有一些方法和一些属性。 .. 当我从 Web 获取数据时,我将所有数据保存到 Widget 对象中,如果其中一个对象具有特定的 class_id(class_id 是一个 属性),那么我将创建一个 Gallery 对象,用于做这个我做这样的事情:

Widget *w = [[Widget alloc] init];
Widget *w_1,*w_2,.....
NSArray *a = @[w,w_1,w_2,ecc];

Gallery *g = (Gallery *)[a objectAtIndex:2];

如果我检查 g class,我会看到 Widget class,然后如果我尝试 运行 Gallery 方法,我会得到 "unrecognized selector sent"...有误吗?

在第一行中,您是 alloc / init 一个 Widget class...然后您试图将 Widget 转换为 Gallery。即使您将 Widget 转换为 Gallery,它仍然是 Widget class,因为您 alloc / init 将其转换为 Widget .

您需要做的是检查 class_id 是否是 Gallery,如果是,alloc / init 作为 Gallery 对象而不是 Widget 对象。然后您将可以访问 Gallery 的属性和函数。示例:

Widget *widget = nil;
if([class_id isEqualToString:gallary_id]) {
    widget = [[Gallery alloc] init];
}
else { 
    widget = [[Widget alloc] init];
}

希望这对您有所帮助。

问题是:错在哪里?

您犯的错误是您假设将 Widget* 转换为 Gallery* 会将对象从 Widget 对象转换为 Gallery 对象。它没有。演员表不会改变对象是什么。强制转换只会改变编译器认为对象是什么。

因为编译器错误地认为它有一个 Gallery 对象,所以它允许您向该对象发送一个 Gallery 方法而不会抱怨。但是它仍然是一个Widget对象在接收消息,它不理解它,所以你的程序崩溃了。