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对象在接收消息,它不理解它,所以你的程序崩溃了。
我有一个 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对象在接收消息,它不理解它,所以你的程序崩溃了。