セレクターの引数の型名を見つける方法はいくつかあります。たとえば、このコードは機能します。
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を知らせてください。
これが解決策です。プロジェクトでこのアプローチを使用する方法が見つかることを願っています。