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

Ole*_*anu 5 objective-c nsobject ios

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

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

[myObjectA respondsToSelector:@selector(getMethod:(NSNumber*))]
Run Code Online (Sandbox Code Playgroud)

你怎么做到这一点?谢谢.

Ros*_*nko 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);
}
Run Code Online (Sandbox Code Playgroud)

第一个和第二个日志参数是系统参数,您对它们不感兴趣,因此您需要另一条树线。

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

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

someMethod:param2:param3:例如可以有这样的实现

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

但!当然,我们有很大的东西,但这里))在这两种情况下,您都会有参数类型名称,其const char *字符串长度为一个符号。编译器按照此处所述对类型名称进行编码。你可以区分 int 和 char,但不能区分 UIView 和 NSString。对于所有 id 类型,您将拥有类型名称“@”,这意味着它是id. 悲伤但真实。不幸的是,我没有找到任何方法来获取完整的类型名称或给定的解码。如果您找到这种方式,请告诉我。

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