Objective c ios子类错误转换子类

Objective c ios子类错误转换子类,objective-c,subclass,nsobject,Objective C,Subclass,Nsobject,我有一个nsobject的Widget类,有一些属性和方法,然后我有一个名为Gallery的Widget子类,这个类有一些方法和一些属性。。。 当我从web获取数据时,我将所有数据保存到Widget对象中,如果此对象中的一个具有特定的class_id(class_id是一个属性),那么我将创建一个Gallery对象,为此,我执行以下操作: Widget *w = [[Widget alloc] init]; Widget *w_1,*w_2,..... NSArray *a = @[w,w_1,

我有一个nsobject的Widget类,有一些属性和方法,然后我有一个名为Gallery的Widget子类,这个类有一些方法和一些属性。。。 当我从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类,我会看到Widget类,然后如果我尝试运行Gallery方法,我会得到“unrecognized selector sent”…错误在哪里?

在第一行中,您是
alloc/init
一个Widget类。。。然后,您尝试将
小部件
转换为
。即使您将
小部件
转换为
,它仍然是
小部件
类,因为您将
alloc/init
转换为
小部件

您需要做的是检查
class\u id
是否是
Gallery
,如果是,
alloc/init
作为
Gallery
对象而不是
小部件
对象。然后,您将可以访问
库的属性和功能。例如:

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

希望这有帮助。

在第一行中,您是
alloc/init
一个小部件类。。。然后,您尝试将
小部件
转换为
。即使您将
小部件
转换为
,它仍然是
小部件
类,因为您将
alloc/init
转换为
小部件

您需要做的是检查
class\u id
是否是
Gallery
,如果是,
alloc/init
作为
Gallery
对象而不是
小部件
对象。然后,您将可以访问
库的属性和功能。例如:

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

希望这能有所帮助。

问题是:错误在哪里

您犯的错误是,您假设将小部件*强制转换为库*会将对象从小部件对象转换为库对象。没有。施法不会改变对象的内容。强制转换只更改编译器认为对象是什么


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

问题是:错误在哪里

您犯的错误是,您假设将小部件*强制转换为库*会将对象从小部件对象转换为库对象。没有。施法不会改变对象的内容。强制转换只更改编译器认为对象是什么


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

从你提供的代码来看,数组中没有一个对象是Gallery类型的?是的,数组的对象是“Widget”类型的,但是Gallery是Widget的一个子类,所以在理论上我可以做castNo向下转换,因为它不是实际的类型,所以不起作用。向下投射仅在实际类型是要投射到的类型时有效。另一种方法是将图库变成一个小部件。这很合乎逻辑。。。由于您没有分配一个库,但只分配了其中的一部分(超类),因此以后无法神奇地成为库。根据您提供的代码,数组中的对象中没有一个是Gallery类型的?是的,数组的对象是“Widget”类型,但Gallery是Widget的子类,所以在理论上我可以做castNo向下播放不会起作用,因为它不是实际的类型。向下投射仅在实际类型是要投射到的类型时有效。另一种方法是将图库变成一个小部件。这很合乎逻辑。。。因为你没有分配一个图库,只是其中的一部分(超类),所以以后它就不能神奇地变成图库了。