Я использую функцию объектива-c forwardInvocation:
, и мне нужно знать, что типа аргумента принятого метода. В моем примере я передаю его int
, но getArgumentTypeAtIndex:
говорит мне, что это вместо id
. Вот простой пример:Ожидайте, что тип аргумента должен быть целым, но вместо этого получить идентификатор
@interface Do : NSObject
+ (void) stuff:(int)x;
@end
@implementation Do
+ (NSMethodSignature *) methodSignatureForSelector:(SEL)selector
{
NSMethodSignature* signature = [super methodSignatureForSelector:selector];
if (!signature)
signature = [self methodSignatureForSelector:@selector(forwardInvocation:)];
return signature;
}
+ (void)forwardInvocation:(NSInvocation *)i
{
const char* argType = [i.methodSignature getArgumentTypeAtIndex:2];
NSLog(@"%s == %s", argType, @encode(id)); // @ == @
NSLog(@"%s == %s", argType, @encode(int)); // @ == i
}
@end
Вот как я это называю:
[Do stuff:123];
Любая идея, почему я не получаю id
вместо int
как тип?
Это работает, но в моем случае мне нужен протокол, который будет добавлен с категорией, а не в оригинальной декларации '@ interface'. По какой-то причине это не работает. – bendytree
Я закончил тем, что вытащил подпись непосредственно из протокола: '[NSMethodSignature signatureWithObjCTypes: protocol_getMethodDescription (@protocol (...), selector, 0, 0) .types]' – bendytree