我有一个带有一些属性和一些方法的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方法我得到“无法识别的选择器发送”....哪里是错误?
答案 0 :(得分:4)
问题是:错误在哪里?
您犯的错误是您假设将Widget *转换为Gallery *会将对象从Widget对象转换为Gallery对象。它没有。演员阵容不会改变对象的内容。强制转换只会改变编译器认为对象的内容。
因为编译器认为错误地认为它有一个Gallery对象,所以它允许您在没有抱怨的情况下向对象发送Gallery方法。但它仍然是一个接收消息的Widget对象,它不理解它,所以你的程序崩溃了。
答案 1 :(得分:2)
在第一行中,您是alloc / init
个Widget类...然后您尝试将Widget
转换为Gallery
。即使您认为Widget
为Gallery
,它仍然是Widget
类,因为您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];
}
希望这有帮助。