У вас есть несколько способов найти имена типов аргументов для селектора. Например, этот код будет работать:
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);
}
Первые и вторые аргументы журнала являются системами, и вы не заинтересованы в них, так еще дереве линии является то, что вам нужно.
также ниже код даст вам тот же результат
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 *
с длиной одного символа. Компилятор кодирует имена типов, как описано here. Вы можете отличать int от char, но не UIView от NSString. Для всех типов идентификаторов вы будете иметь имя типа '@', что означает, что это id
. Печально, но верно. К сожалению, я не нашел способов получить полное полное имя типа или декодирование. Если вы найдете этот способ, дайте мне знать PLS.
Так что это решение. Надеюсь, вы найдете способ использования этого подхода в своем проекте.
Вы не можете объявить два метода с тем же именем и разными типами параметров. –
Хорошо, предположим, что у нас есть разные типы объектов с тем же именем метода, но с разными типами аргументов. Что вы тогда делаете? –
вам нужно будет использовать функции [Objective-C Runtime Functions] (https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html#//apple_ref/doc/ uid/TP40001418) напрямую –