[ ] を使用してオブジェクトにメッセージを送信するとobjc_msgSend()
、最初の引数としてオブジェクトへのポインターが必要であり、2 番目の引数にはセレクターが必要であることに変換されます。
しかし、It is not a pointer to object のようなメッセージング クラス
[myClass doSomething];
についてはどうでしょう。
[ ] を使用してオブジェクトにメッセージを送信するとobjc_msgSend()
、最初の引数としてオブジェクトへのポインターが必要であり、2 番目の引数にはセレクターが必要であることに変換されます。
しかし、It is not a pointer to object のようなメッセージング クラス
[myClass doSomething];
についてはどうでしょう。
Mike Ash がどのように機能するかについて素晴らしい説明をしてobjc_msgSend
います: Friday Q&A 2012-11-16: objc_msgSend をビルドしましょう。
私はそれmyClass
が(文字通り)クラスの名前であると仮定しています(通常、クラスは大文字で始まりますが、これは命名規則に従わないクラスであると仮定します)。
Objective-C のメッセージ送信構文には 2 つのケースがあります。あなたが言及した1つは、左側がオブジェクトへのポインターに評価される式である場合です。メッセージはそのオブジェクトに送信されます。2 つ目は、左側がクラスの名前である識別子である場合、コンパイラはそのクラスのクラス オブジェクトにメッセージを送信します。より技術的には、コンパイラはクラス オブジェクトへのポインタを最初の引数として に渡しますobjc_msgSend()
。これが可能になるのは、クラスごとにクラス オブジェクトの構造と場所を配置するのはコンパイラであり、そのクラス オブジェクトのアドレスを知っているからです。
[myClass doSomething];
直感的に、次のように考えることができます。
Class foo = objc_getClass("myClass");
[foo doSomething];
また
Class foo = NSClassFromString(@"myClass");
[foo doSomething];
ただし、クラス オブジェクトへのポインターを取得するためにランタイム ルックアップを実行する必要はありません。コンパイラーはコンパイル時にポインターを認識します。
実際、メッセージをクラスに送信すると、実際にはそのメッセージがクラス オブジェクトに送信されます。クラス オブジェクトは、いくつかの制限付きで他のオブジェクトと同じように動作します。
Appleの参照から:
Objective-C では、クラスはそれ自体、Class と呼ばれる不透明な型を持つオブジェクトです。クラスは、前述のインスタンスの宣言構文を使用して定義されたプロパティを持つことはできませんが、メッセージを受け取ることはできます。
ランタイムはメッセージを SEL に変換し、そのクラスがスーパークラスの継承メソッドを含むその SEL を持つメッセージに応答するかどうかを確認します。応答すると、メソッドが実行されます。