id a = self->isa;
id b = ((NSObject*)self)->isa;
a と b は同じ値を保持します。
今与えられた isa ポインタは同じですが、なぜ
[(Animal*)Person speakEnglish];
エラーが発生しますか?子クラスをその親クラスにキャストすると、子のメソッドを呼び出すことができなくなり、メソッド呼び出し検索は isa ポインターに基づいているため、キャストによって isa ポインターが変更されると思いました。
メソッド セレクターがどのように実装されているか知りたいので、インスタンスの isa ポインターでも Person を指します。インスタンスの Person のメソッドを呼び出すと、エラーが発生します。