id a = self->isa;
id b = ((NSObject*)self)->isa;
a和b持有相同的值。
现在假设一个指针是相同的,为什么
[(Animal*)Person speakEnglish];
出现错误?我认为强制类型转换会改变isa指针,因为如果我将子类转换为父类,就不能再调用子类的方法了,而方法调用搜索是基于isa指针的。
我想知道如何实现方法选择器,即使一个实例的isa指针指向Person,如果我调用该实例的Person方法,仍然会出现错误。
id a = self->isa;
id b = ((NSObject*)self)->isa;
a和b持有相同的值。
现在假设一个指针是相同的,为什么
[(Animal*)Person speakEnglish];
出现错误?我认为强制类型转换会改变isa指针,因为如果我将子类转换为父类,就不能再调用子类的方法了,而方法调用搜索是基于isa指针的。
我想知道如何实现方法选择器,即使一个实例的isa指针指向Person,如果我调用该实例的Person方法,仍然会出现错误。
我假设Animal
没有方法-speakEnglish
,但是Person
的原始类有这个方法。
然后,你会得到一个编译器错误,因为该方法未声明。请注意,(如@jrturton和@xlc0212所提到的)编译器不知道运行时的任何信息。
可能在运行时对象具有可调用的选择器:
[(Animal*)Person performSelector: @selector(speakEnglish)];
这个使用运行时数据。更准确地说,它检查方法实现是否与此选择器连接,并调用此实现。
然而,编译器无法知道,因为编译器依赖于静态类型信息。因此,您应该提供正确的类型信息。但是您却相反:丢弃了正确的类型。
+speakEnglish
吗? - jaumeisa
无关;这是静态类型的问题。 - MatthiasPerson
强制转换为其父类Animal
失败,因为Person
是大写的,按照惯例是一个类。现在我认为OP可能意味着[(Animal *)person speakEnglish]
,其中person
是类Person
的实例。无论如何,正如你所说,这与isa
无关。 - jaume