web-dev-qa-db-ja.com

メソッドとセレクターの違いは何ですか?

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

78
redconservatory

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

  • Selector-Selectorは、メソッドのnameです。これらのセレクターに精通している:allocinitrelease、_dictionaryWithObjectsAndKeys:_、_setObject:forKey:_など。コロンは一部であることに注意してくださいセレクターの;このメソッドがパラメーターを必要とすることを識別する方法です。また(非常にまれですが)、次のようなセレクターを使用できます:_doFoo:::_。これは3つのパラメーターをとるメソッドであり、_[someObject doFoo:arg1 :arg2 :arg3]_のように呼び出します。セレクタコンポーネントの各部分の前に文字が存在する必要はありません。前述したように、これは非常にまれであり、Cocoaフレームワークで使用されることはありません。 Cocoaでセレクターを直接操作できます。タイプはSELSEL aSelector = @selector(doSomething:)またはSEL aSelector = NSSelectorFromString(@"doSomething:");です。

  • メッセージ-メッセージはセレクターであり、送信する引数です。 _[dictionary setObject:obj forKey:key]_と言うと、「メッセージ」はセレクター_setObject:forKey:_と引数objおよびkeyです。メッセージは、後で呼び出すためにNSInvocationオブジェクトにカプセル化できます。メッセージは受信機に送信されます。 (つまり、メッセージを「受信」するオブジェクト)。

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


あなたが求めなかった他のいくつかの関連事項:

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

  • 実装-メソッドの実際の実行可能コード。実行時の型はIMPであり、実際には単なる関数ポインターです。 iOS 4.3には、ブロックをIMPに変換する新しい機能が含まれています。これはreally coolです。

実現する楽しいことの1つは、メソッド(セレクター)のname実装と異なることです。メソッドの(IMP)。これは、大胆な気分であれば、それらを交換できることを意味します。ハッシュテーブルのエントリを編集するだけなので、実行時にメソッドを追加および削除することもできます。キーはセレクターで、値はメソッドのIMPです。これにより、本当にクレイジーで奇抜なことができます。気弱な人向けではありません。 :)

139
Dave DeLong

メソッドは、オブジェクトまたはクラスが何らかのアクションを実行するように要求されたときに実行される実装です。それを含むクラスのスコープ内にあるため、他のクラスを介して参照される場合は異なります。セレクターは、メソッドの名前を表す識別子です。特定のクラスまたはメソッドに関連するものではなく、クラスまたはインスタンスメソッドであるかどうかにかかわらず、任意のクラスのメソッドを記述するために使用できます。

単純に、セレクタは辞書のキーのようなものです。誰かが話しているメソッドを知ることができますが、辞書自体(クラスまたはオブジェクト)も持っている場合に限ります。メソッドは、セレクターをキーとして使用して、ディクショナリーから値を要求したときに取得されるものです。

9
ughoavgfhw

このサイトには、問題のすべての用語の概要があります。 http://www.otierney.net/objective-c.html

リンクをチェックしてください、しかし、私は簡単な要約をします:

メソッドは基本的に、お気に入りのプログラミング言語で慣れている関数のメソッドに似ています。

メッセージ(記事から)「メッセージは別のオブジェクトに動的に転送できます。Objective-Cでオブジェクトのメッセージを呼び出すということは、オブジェクトがそのメッセージを実装することを意味するのではなく、直接実装するか、方法を知っているオブジェクトにメッセージを転送します。」

セレクタには2つの意味があります。メソッドの名前を参照することも、「ソースコードのコンパイル時に名前を置き換える一意の識別子を参照することもできます。コンパイルされたセレクタのタイプはSELです」。 (from: http://developer.Apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocSelectors.html

1
nstehr