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

a と b は同じ値を保持します。

今与えられた isa ポインタは同じですが、なぜ

[(Animal*)Person speakEnglish];

エラーが発生しますか?子クラスをその親クラスにキャストすると、子のメソッドを呼び出すことができなくなり、メソッド呼び出し検索は isa ポインターに基づいているため、キャストによって isa ポインターが変更されると思いました。

メソッド セレクターがどのように実装されているか知りたいので、インスタンスの isa ポインターでも Person を指します。インスタンスの Person のメソッドを呼び出すと、エラーが発生します。

4

1 に答える 1

0

Animalhas no methodと仮定しますが、 has-speakEnglishの元のクラスですPerson

次に、メソッドが宣言されていないため、コンパイラ エラーが発生します。(@jrturton と @xlc0212 が述べたように) コンパイラはランタイムについて何も知らないことに注意してください。

オブジェクトが (実行時に) 呼び出せるセレクターを持っている可能性があります。

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

これはランタイム データを使用します。より正確には、メソッド実装がこのセレクターに接続されているかどうかを確認し、この実装を呼び出します。

ただし、コンパイラは静的な型情報に依存しているため、コンパイラが知る方法はありません。したがって、適切なタイプ情報を提供する必要があります。しかし、あなたは逆のことをします: 正しい型を捨てます。

于 2013-02-15T16:30:01.393 に答える