124

まず、セレクターが何であるかを本当に理解しているかどうかはわかりません。私の理解では、これはメソッドの名前であり、タイプ「SEL」のクラスに割り当ててから、respondToSelectorなどのメソッドを実行して、レシーバーがそのメソッドを実装しているかどうかを確認できます。誰かがより良い説明を提供できますか?

次に、この時点で、次のコードがあります。

NSString *thing = @"Hello, this is Craig";

SEL sel = @selector(lowercaseString:);
NSString *lower = (([thing respondsToSelector:sel]) ? @"YES" : @"NO");
NSLog (@"Responds to lowercaseString: %@", lower);
if ([thing respondsToSelector:sel]) //(lower == @"YES")
    NSLog(@"lowercaseString is: %@", [thing lowercaseString]);

ただし、これthingは明らかに一種のNSStringであり、lowercaseStringに応答する必要がありますが、「yes」を返す条件付きの「respondsToSelector」を取得できません。

4

8 に答える 8

183

メソッド名には細心の注意を払う必要があります。この場合、メソッド名は " " であり、" lowercaseString" ではありませんlowercaseString:(コロンがないことに注意してください)。オブジェクトはメッセージに応答しますが、メッセージには応答しないNOため、返されるのはそのためです。NSStringlowercaseStringlowercaseString:

コロンを追加するタイミングをどのように判断しますか? メッセージを呼び出すときにコロンを追加する場合は、メッセージ名にコロンを追加します。これは、1 つの引数を取る場合に発生します。引数を取らない場合 ( の場合のようにlowercaseString)、コロンはありません。複数の引数を取る場合は、 のように、コロンと一緒に追加の引数名を追加する必要がありますcompare:options:range:locale:

ドキュメントを見て、末尾のコロンの有無に注意することもできます。

于 2009-04-10T19:42:32.397 に答える
12

セレクターは、コンパイルされたコードでメソッドを直接参照するための効率的な方法です。実際に値を SEL に割り当てるのはコンパイラーです。

他の人はあなたの q の 2 番目の部分を既にカバーしています。最後の ':' は、探しているものとは異なる署名に一致します (この場合、その署名は存在しません)。

于 2009-04-10T19:50:20.770 に答える
10

それはあなたが望む@selector(lowercaseString)からであり、ではありません@selector(lowercaseString:)。微妙な違いがあります。2 番目のものはパラメーターを意味しますが (末尾のコロンに注意してください)、- [NSString lowercaseString]パラメーターを取りません。

于 2009-04-10T19:44:13.077 に答える
6

この場合、セレクターの名前が間違っています。ここのコロンはメソッド シグネチャの一部です。これは、メソッドが 1 つの引数を取ることを意味します。私はあなたが望むと信じています

SEL sel = @selector(lowercaseString);
于 2009-04-10T19:41:58.590 に答える
3

NSString のメソッドはlowercaseString(1 引数) ではなくlowercaseString:(0 引数) です。

于 2009-04-10T19:42:42.097 に答える
1

コロンを関数名の一部と考えないでください。区切り文字と考えてください。区切るものがない場合 (関数に値がない場合) は必要ありません。

理由はわかりませんが、この OO のすべてが Apple 開発者にとってなじみのないものであるように思われます。Visual Studio Express を入手して、それも試してみることを強くお勧めします。どちらかが優れているからではなく、デザインの問題や考え方を理解するのに良い方法です。

お気に入り

introspection = reflection
+ before functions/properties = static
- = instance level

問題をさまざまな方法で見ることは常に良いことであり、プログラミングは究極のパズルです。

于 2009-04-11T12:05:47.133 に答える
0

Apple のドキュメントを理解していると、セレクターは呼び出したいメソッドの名前を表します。セレクターの良いところは、呼び出される正確なメソッドが異なる場合に使用できることです。簡単な例として、次のようなことができます。

SEL selec;
if (a == b) {
selec = @selector(method1)
}
else
{
selec = @selector(method2)
};
[self performSelector:selec];
于 2014-10-16T23:30:27.250 に答える