id a = self->isa;
id b = ((NSObject*)self)->isa;
a和b保持相同的值。
现在给出isa指针是一样的,为什么
[(Animal*)Person speakEnglish];
给出错误?我认为转换会改变isa指针,因为如果我将子类转换为它的父类,我就不能再调用子方法了,方法调用搜索是基于isa指针。
我很想知道方法选择器是如何实现的,所以即使是一个实例的指针指向Person,如果我调用该实例的Person方法,我也会收到错误。
答案 0 :(得分:0)
我认为Animal
没有方法-speakEnglish
,但Person
的原始类有。{/ p>
然后,您收到编译器错误,因为该方法未声明。请注意,(如@jrturton和@ xlc0212所述)编译器对运行时没有任何了解。
对象(在运行时)可能有一个可以调用的选择器:
[(Animal*)Person performSelector: @selector(speakEnglish)];
这使用运行时数据。更确切地说,它检查方法实现是否与此选择器连接并调用此实现。
但是,编译器无法知道,因为编译器依赖于静态类型信息。因此,您应该提供正确的类型信息。但你做的恰恰相反:你扔掉了正确的类型。