id a = self->isa;
id b = ((NSObject*)self)->isa;
A和b具有相同的值。
现在给定isa指针是相同的,为什么
[(Animal*)Person speakEnglish];
给出错误?我认为强制转换会改变isa指针,因为如果我将一个子类强制转换为它的父类,我就不能再调用子类的方法,而方法调用搜索是基于isa指针的。
我想知道方法选择器是如何实现的,所以即使实例的一个指针指向Person,如果我调用实例的Person方法,我会得到一个错误。
发布于 2013-02-15 16:30:01
我假设Animal
没有-speakEnglish
方法,但是Person
的原始类有。
然后,你会得到一个编译器错误,因为这个方法没有声明。请注意,(正如@jrturton和@xlc0212所提到的)编译器对运行时一无所知。
对象(在运行时)可能有一个选择器,可以调用:
[(Animal*)Person performSelector: @selector(speakEnglish)];
这使用运行时数据。更准确地说,它检查方法实现是否与此选择器连接并调用此实现。
但是,编译器无法知道,因为编译器依赖于静态类型信息。因此,您应该提供正确的类型信息。但是你做了相反的事情:你丢弃了正确的类型。
https://stackoverflow.com/questions/14494629
复制相似问题