1. ホーム
  2. objective-c

[解決済み] メソッドとセレクタの違いは何ですか?

2023-07-01 17:38:31

質問

Objective-Cのメソッド、セレクタ、メッセージの違いは何ですか?

どのように解決するのですか?

これは素晴らしい質問です。

  • セレクタ - セレクタは という名前です。 という名前のメソッドです。 このセレクタはとても馴染みがありますね。 alloc , init , release , dictionaryWithObjectsAndKeys: , setObject:forKey: などです。 コロンはセレクタの一部であり、このメソッドがパラメータを必要とすることを識別する方法であることに注意してください。 また(極めて稀ですが)、次のようなセレクタも可能です。 doFoo::: . これは3つのパラメータを受け取るメソッドで、次のように呼び出します。 [someObject doFoo:arg1 :arg2 :arg3] . セレクタコンポーネントの各パートの前に文字があることは要求されていません。 先ほども言ったように、これは極めて稀なことで、Cocoaフレームワークで使われているのを見かけることはないでしょう。 Cocoaでは、セレクタを直接操作することができます。 それらは SEL : SEL aSelector = @selector(doSomething:) または SEL aSelector = NSSelectorFromString(@"doSomething:");

  • メッセージ - メッセージとは、セレクタと一緒に送る引数のことです。 もし私が [dictionary setObject:obj forKey:key] と言う場合、"message" はセレクタである setObject:forKey: と引数 objkey . メッセージのカプセル化は NSInvocation オブジェクトにカプセル化し、後で呼び出すことができます。 メッセージは レシーバ . (すなわち、メッセージを "receives" するオブジェクト) に送信されます。

  • メソッド - メソッドはセレクタと実装(および付随するメタデータ)の組み合わせです。 実装は実際のコードブロックであり、関数ポインタ( IMP ). 実際のメソッドは、内部的に Method 構造体(ランタイムから取得可能)を使って内部的に取得することができます。


その他、聞かれなかった関連事項をいくつか。

  • メソッドのシグネチャ - メソッドシグネチャは、メソッドによって返されるデータ型と、メソッドによって受け入れられるデータ型を表します。 これらは実行時に NSMethodSignature で表現され、(場合によっては) 生の char* .

  • 実装 - メソッドの実際の実行コード。 実行時の型は IMP で、実際には単なる関数ポインタです。 iOS 4.3 には、ブロックを IMP . これは 本当にかっこいい .

気づいてみると楽しいことのひとつは という名前 はメソッド (セレクタ) とは異なるということです。 実装 とは区別されます。 これは、もしあなたが大胆な気分なら、それらを入れ替えることができることを意味します。 また、実行時にメソッドを追加したり削除したりすることもできます。 なぜなら、あなたが行っているのはハッシュテーブルのエントリを編集することだからです。 IMP を編集するだけだからです。 これによって、本当にクレイジーでトリッピーなことができるようになります。 気の弱い人には向かないかもしれませんが :)