Objective-Cの場合
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/08/02 03:50 UTC 版)
「名前修飾」の記事における「Objective-Cの場合」の解説
Objective-Cのメソッドは、本質的に二種類に分けられる。一つは クラス(「静的」)メソッドで、もう一つはインスタンスメソッドである。Objective-Cでのメソッド宣言は次のような形式である。 + method name: argument name1:parameter1 ...- method name: argument name1:parameter1 ... クラスメソッドは + で示される。インスタンスメソッドは - で示される。典型的なクラスメソッド宣言は、次のようになるだろう + (id) initWithX: (int) number andY: (int) number;+ (id) new; インスタンスメソッドならば、次のようである - (id) value;- (id) setValue: (id) new_value; それぞれのメソッド宣言は特有の内部表現を持っている。コンパイル時に、メソッド名は次のスキームによって変換される。クラスメソッドでは _c_Class_methodname_name1_name2_ ... となり、インスタンスメソッドでは _i_Class_methodname_name1_name2_ ... となる。 Objective-Cのコロンは下線に変換される。そこで、Point クラスに属するクラスメソッド + (id) initWithX: (int) number andY: (int) number; は次のように変換されるだろう_c_Point_initWithX_andY_。同じクラスに属するインスタンスメソッド - (id) value; は _i_Point_value となる。 クラスの各メソッドはこのようにラベルされるが、全てのメソッドがこのように表現された場合、あるクラスが応答すべきメソッドを探し出すのは面倒な作業となりうる。そのため、各々のメソッドに整数のようなシンボルを一意に割り当てる。このようなシンボルは「セレクタ」として知られる。Objective-Cでは、プログラマがセレクタを直接管理することができる — Objective-Cではそれらに特別の型を与えている — SEL。 コンパイル中に、(_i_Point_valueのような)文字による表現からセレクタ(SEL型)へのマップが作成される。文字による表現を操作するよりもセレクタを管理する方がメソッドを効果的に扱うことができる。セレクタがマッチするのはメソッドの名前だけであり、それが属するクラスではないということに注意してほしい。クラスが異なれば同じ名前のメソッドでも実装が異なることがある。このため、メソッドの実装にも特別の識別子が与えられる — 実装ポインタ (implementation pointer) と呼ばれ、IMP 型を持つ。 オブジェクトにメッセージを送ると、それはコンパイラによって、 id objc_msgSend(id receiver, SEL selector, ...) 関数ないしはその従兄弟のどれかに対する呼び出しとしてエンコードされる。ここで、receiverはそのメッセージの受け手であり、SELによって呼び出されるメソッドが決まる。各々のクラスはそれ自身の表を持っており、セレクタと実装 — メソッドの実体が存在するメモリ空間を指定する実装ポインタ — との相互対照ができるようになっている。また別の表にはクラスとインスタンスメソッドが記録される。SELからIMPへの対照表に格納されることはさておき、関数は本質的に無名である。 あるセレクタに対するSELの値はクラスによって変わることがなく、多態性を実現している。 Objective-Cの実行環境はメソッドの引数と返り値の型についての情報を保持しているが、メソッドの名前の一部として保持されるわけではなく、クラスによって変化しうる。 Objective-Cは名前空間をサポートしないので、クラス名を修飾する必要はない。
※この「Objective-Cの場合」の解説は、「名前修飾」の解説の一部です。
「Objective-Cの場合」を含む「名前修飾」の記事については、「名前修飾」の概要を参照ください。
- Objective-Cの場合のページへのリンク