セレクターに関する Apple のドキュメントを読みましたが、セレクターが必要な理由がわかりません。
私が理解できる限り、セレクターは関数ポインターと同等です。そうですか?
セレクターに関する Apple のドキュメントを読みましたが、セレクターが必要な理由がわかりません。
私が理解できる限り、セレクターは関数ポインターと同等です。そうですか?
セレクターは、オブジェクトのメソッド実装を取得するために使用されます。
たとえば、ほとんどすべてのオブジェクトはdescription
、スーパークラスから実装を継承している場合でも、メソッドを実装します。関数ポインタは、の1つの特定の実装のみを指すことができますdescription
(たとえば、NSStringのバージョンまたはNSNumberのバージョンのみを指すことができますが、両方を指すことはできません)。1つのクラスのdescription
実装の関数ポインターを取得してすべてのクラスに使用することはできませんが、同じdescription
セレクターを使用できます。また、ターゲットとして使用するオブジェクトに関係なく、適切なメソッド実装が常に使用されます。
セレクターは関数ポインターではありません。
セレクターは、一意のアドレス メソッド識別子 (メッセージ名) です。これらは、メッセンジャー関数 (objc_msgSend_*()) を高速にするために必要です。セレクターはメモリ内に一意のアドレスを持っているため、メソッド名を検索するときに、メッセンジャーは毎回かなり高価な文字列比較を行う必要はありません。であるため、単純なポインタ比較で十分です。