ios子类化错误转换子类

时间:2015-02-20 14:36:05

标签: objective-c subclass nsobject

我有一个带有一些属性和一些方法的nsobject的Widget类,然后我有一个名为Gallery的Widget子类,这个类有一些方法和一些属性...... 当我从web获取数据时,我将所有数据保存到Widget对象中,如果其中一个obj具有特定的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类我看到Widget类,然后如果我尝试运行Gallery方法我得到“无法识别的选择器发送”....哪里是错误?

2 个答案:

答案 0 :(得分:4)

问题是:错误在哪里?

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

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

答案 1 :(得分:2)

在第一行中,您是alloc / init个Widget类...然后您尝试将Widget转换为Gallery。即使您认为WidgetGallery,它仍然是Widget类,因为您alloc / initWidget

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

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

希望这有帮助。