[解決済み] メソッドとセレクタの違いは何ですか?
質問
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:
と引数obj
とkey
. メッセージのカプセル化はNSInvocation
オブジェクトにカプセル化し、後で呼び出すことができます。 メッセージは レシーバ . (すなわち、メッセージを "receives" するオブジェクト) に送信されます。 -
メソッド - メソッドはセレクタと実装(および付随するメタデータ)の組み合わせです。 実装は実際のコードブロックであり、関数ポインタ(
IMP
). 実際のメソッドは、内部的にMethod
構造体(ランタイムから取得可能)を使って内部的に取得することができます。
その他、聞かれなかった関連事項をいくつか。
-
メソッドのシグネチャ - メソッドシグネチャは、メソッドによって返されるデータ型と、メソッドによって受け入れられるデータ型を表します。 これらは実行時に
NSMethodSignature
で表現され、(場合によっては) 生のchar*
. -
実装 - メソッドの実際の実行コード。 実行時の型は
IMP
で、実際には単なる関数ポインタです。 iOS 4.3 には、ブロックをIMP
. これは 本当にかっこいい .
気づいてみると楽しいことのひとつは
という名前
はメソッド (セレクタ) とは異なるということです。
実装
とは区別されます。 これは、もしあなたが大胆な気分なら、それらを入れ替えることができることを意味します。 また、実行時にメソッドを追加したり削除したりすることもできます。 なぜなら、あなたが行っているのはハッシュテーブルのエントリを編集することだからです。
IMP
を編集するだけだからです。 これによって、本当にクレイジーでトリッピーなことができるようになります。 気の弱い人には向かないかもしれませんが :)
関連
-
[解決済み] Objective-Cの#importと#includeの違いは何ですか?
-
[解決済み] Objective-Cで乱数を発生させる
-
[解決済み] アトミック属性と非アトミック属性の違いは何ですか?
-
[解決済み] キーボードがあるときに、UITextFieldを編集開始時に上に移動させるには?
-
[解決済み] カスタムオブジェクトを含むNSMutableArrayをソートするにはどうすればよいですか?
-
[解決済み] performSelectorのセレクタが不明なため、リークが発生する可能性があります。
-
[解決済み] クラスメソッドとインスタンスメソッドの違いは何ですか?
-
[解決済み] objectForKeyとvalueForKeyの違い?
-
[解決済み] performSelectorの使用: メソッドを呼び出すだけと比較した場合
-
[解決済み] Xcodeでプリプロセッサ・シンボルを定義する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] error: Writeable atomic property cannot pair with synthesized setter/getter and the user defined setter/getter.
-
[解決済み] Objective-Cのセレクタ?
-
[解決済み] このgdbの出力は何を意味しているのでしょうか?
-
[解決済み] NSLog オーバーライドされた記述方法でのオブジェクトのメモリアドレスの記録
-
[解決済み] メソッドが存在するかどうかをチェックする
-
[解決済み] Objective-Cのプロテクトメソッド
-
[解決済み] Objective-Cでnilにメッセージを送信する
-
[解決済み] NSTimeInterval(秒)を分単位に変換する方法
-
[解決済み] NSStringをstd::stringに変換するにはどうしたらいいですか?
-
[解決済み] iOSです。2つの日付を比較する