3
id a = self->isa;
id b = ((NSObject*)self)->isa;

a 和 b 具有相同的值。

现在给定的 isa 指针是一样的,为什么

[(Animal*)Person speakEnglish];

给出错误?我认为强制转换会改变 isa 指针,因为如果我将子类强制转换为它的父类,我就不能再调用子类的方法了,方法调用搜索是基于 isa 指针的。

我很想知道方法选择器是如何实现的,所以即使是一个实例的指针指向Person,如果我调用实例的Person的方法,我会得到一个错误。

4

1 回答 1

0

我假设Animalhas no method -speakEnglish,但原始类Personhas 。

然后,你会得到一个编译器错误,因为没有声明该方法。请注意,(正如@jrturton 和@xlc0212 所提到的)编译器对运行时一无所知。

对象(在运行时)可能有一个可以调用的选择器:

 [(Animal*)Person performSelector: @selector(speakEnglish)];

这使用运行时数据。更准确地说,它检查方法实现是否与此选择器连接并调用此实现。

但是,编译器无法知道,因为编译器依赖于静态类型信息。因此,您应该提供正确的类型信息。但你做的恰恰相反:你扔掉了正确的类型。

于 2013-02-15T16:30:01.393 回答