5

getMethod:(NSNumber*)aNumber同じメソッド名を持つが、:や。のような異なる引数タイプを持つ異なるObjectがあるとしgetMethod:(NSString*)aStringます。

responsesToSelectorで確認する方法、または他の方法で、オブジェクトが特定の引数タイプでセレクターに応答する場合は、次のようになります。

[myObjectA respondsToSelector:@selector(getMethod:(NSNumber*))]

これはどうやるんですか?ありがとう。

4

2 に答える 2

4

セレクターの引数の型名を見つける方法はいくつかあります。たとえば、このコードは機能します。

Method method = class_getInstanceMethod([self class], @selector(someMethod:param2:param3:));
char type[256];
int argsNumber = method_getNumberOfArguments(method);
for (int i = 0; i < argsNumber; i++) {
    method_getArgumentType(method, i, type, 256);
    NSLog(@"%s", type);
}

1番目と2番目のログ引数はシステムであり、それらには関心がないため、別のツリーラインが必要です。

また、以下のコードでも同じ結果が得られます

NSMethodSignature *sig = [self methodSignatureForSelector:@selector(someMethod:param2:param3:)];
int args = [sig numberOfArguments];
for (int i = 0; i < args; i++) {
    NSLog(@"%s", [sig getArgumentTypeAtIndex:i]);
}

someMethod:param2:param3:たとえば、このような実装を行うことができます

- (BOOL) someMethod:(NSString *)str param2:(UIView *)view param3:(NSInteger)number
{
    return NO;
}

しかし!当然のことながら、ここには大きなものがあります))どちらの場合も、引数のタイプはconst char *、長さが1つのシンボルの文字列の名前になります。コンパイラは、ここで説明するように型名をエンコードします。intはcharとは異なりますが、UIViewはNSStringとは異なります。すべてのIDタイプについて、タイプ名は「@」になります。これは、それがであることを意味しidます。悲しいですが本当。残念ながら、完全な型名全体を取得したり、デコードしたりする方法は見つかりませんでした。あなたがこの方法を見つけるならば、私にplsを知らせてください。

これが解決策です。プロジェクトでこのアプローチを使用する方法が見つかることを願っています。

于 2013-02-12T12:36:27.187 に答える
1

実際にはメソッドのパラメータタイプを区別することはできませんが、代わりに次のようなことを行うことができます。

if([myObject isKindOfClass:[A class]])
     [myObjectA getMethod:aNumber];
else if([myObject isKindOfClass:[B class]])
     [myObjectA getMethod:aString];

正しいタイプであることを確認したので、セレクターに応答するかどうかを確認する必要はありません。たぶんあなたの問題はこれよりも複雑ですが、そうでなければこれはうまくいくはずです。

于 2013-02-12T10:52:12.197 に答える