実行時に、メッセージがオブジェクトに送信されると、そのオブジェクトはそれを作成したクラスに移動し、「このメッセージが送信されました。一致するメソッドのコードを実行してください」と言います。これは、実行するメソッドがコンパイル時に決定されるほとんどのコンパイル言語とは異なります。
オブジェクトはどのクラスがそれを作成したかをどのように知っていますか?
isaポインタを使用します。すべてのオブジェクトには、isaというインスタンス変数があります。オブジェクトが作成されると、クラスは戻りオブジェクトのisaインスタンス変数をそのクラスを指すように設定します。オブジェクトがそのクラスの「インスタンス」であるため、これはisaポインタと呼ばれます。おそらくisaポインターを明示的に使用することは決してないでしょうが、その存在はObjective-Cにその力の多くを与えます。
オブジェクトは、そのクラス(isaポインターが指す)が関連するメソッドを実装している場合にのみメッセージに応答します。これは実行時に発生するため、XCodeはコンパイル時(アプリケーションのビルド時)にオブジェクトがメッセージに応答するかどうかを常に把握できるとは限りません。XCodeは、応答しないオブジェクトにメッセージを送信していると判断した場合はエラーを表示しますが、不明な場合はアプリケーションをビルドします。
何らかの理由で(そして多くの可能性がありますが)、応答しないオブジェクトにメッセージを送信することになった場合、アプリケーションは例外をスローします。したがって、isaポインタがランタイムエラーの理由です。ここで詳細と例を確認しましょう:IOS-Objective-C-例外と認識されないセレクター