1

[ ] を使用してオブジェクトにメッセージを送信するとobjc_msgSend()、最初の引数としてオブジェクトへのポインターが必要であり、2 番目の引数にはセレクターが必要であることに変換されます。

しかし、It is not a pointer to object のようなメッセージング クラス [myClass doSomething]; についてはどうでしょう。

4

4 に答える 4

1

Mike Ash がどのように機能するかについて素晴らしい説明をしてobjc_msgSendいます: Friday Q&A 2012-11-16: objc_msgSend をビルドしましょう

于 2013-10-16T13:04:34.833 に答える
1

私はそれmyClassが(文字通り)クラスの名前であると仮定しています(通常、クラスは大文字で始まりますが、これは命名規則に従わないクラスであると仮定します)。

Objective-C のメッセージ送信構文には 2 つのケースがあります。あなたが言及した1つは、左側がオブジェクトへのポインターに評価される式である場合です。メッセージはそのオブジェクトに送信されます。2 つ目は、左側がクラスの名前である識別子である場合、コンパイラはそのクラスのクラス オブジェクトにメッセージを送信します。より技術的には、コンパイラはクラス オブジェクトへのポインタを最初の引数として に渡しますobjc_msgSend()。これが可能になるのは、クラスごとにクラス オブジェクトの構造と場所を配置するのはコンパイラであり、そのクラス オブジェクトのアドレスを知っているからです。

[myClass doSomething];直感的に、次のように考えることができます。

Class foo = objc_getClass("myClass");
[foo doSomething];

また

Class foo = NSClassFromString(@"myClass");
[foo doSomething];

ただし、クラス オブジェクトへのポインターを取得するためにランタイム ルックアップを実行する必要はありません。コンパイラーはコンパイル時にポインターを認識します。

于 2013-10-17T02:54:18.600 に答える
1

実際、メッセージをクラスに送信すると、実際にはそのメッセージがクラス オブジェクトに送信されます。クラス オブジェクトは、いくつかの制限付きで他のオブジェクトと同じように動作します。

Appleの参照から:

Objective-C では、クラスはそれ自体、Class と呼ばれる不透明な型を持つオブジェクトです。クラスは、前述のインスタンスの宣言構文を使用して定義されたプロパティを持つことはできませんが、メッセージを受け取ることはできます。

于 2013-10-16T13:40:05.543 に答える
0

ランタイムはメッセージを SEL に変換し、そのクラスがスーパークラスの継承メソッドを含むその SEL を持つメッセージに応答するかどうかを確認します。応答すると、メソッドが実行されます。

于 2013-10-16T13:47:31.023 に答える