在选择器中具有不同参数类型的respondsToSelector

时间:2013-02-12 10:08:22

标签: ios objective-c nsobject

假设我们有不同的Object,它们具有相同的方法名称但具有不同的参数类型,如:getMethod:(NSNumber*)aNumbergetMethod:(NSString*)aString

如果一个对象以特定的参数类型响应选择器,如何使用respondsToSelector或通过其他方式检查,如下所示:

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

你是怎么做到的? 感谢。

2 个答案:

答案 0 :(得分: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);
}

第一个和第二个日志参数是系统,你对它们不感兴趣,所以你需要另一个树行。

下面的代码也会给你相同的结果

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;
}

BUT!因为我们有很大但是在这里))在这两种情况下,你都会有参数类型名称const char *字符串,长度为一个符号。编译器按照描述here对类型名称进行编码。您可以将不同于char而不是来自NSString的UIView。对于所有ID类型,您将使用类型名称“@”表示它是id。伤心但真实。不幸的是,我没有找到任何方法来获得完整的类型名称或解码。如果你能找到这种方式请告诉我。

所以这是解决方案。希望您能找到在项目中使用此方法的方法。

答案 1 :(得分:0)

你实际上无法区分方法参数类型,但也许你可以做这样的事情:

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

您不需要检查它是否响应选择器,因为您已检查其类型是否正确。也许你的问题比这更复杂,但如果不是这样的话,这应该有用。