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

标签 ios objective-c nsobject

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

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

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

你是怎么做到的? 谢谢。

最佳答案

您有几种方法可以找到选择器参数的类型名称。 例如,这段代码将起作用:

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 类型,您将拥有类型名称“@”,这意味着它是 id。悲伤但真实。不幸的是,我还没有找到任何方法来获得完整的类型名称或给定的解码。如果你会找到这种方式,请告诉我。

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

关于ios - 选择器中具有不同参数类型的 respondsToSelector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14829975/

相关文章:

ios - 如何处理更新后启动的 iOS 应用程序?

ios - 如何通过多点连接发送多组数据

ios - 如何取消归档 NSManagedObject

objective-c - 如何在UI线程上闪烁按钮?

objective-c - 像 Xcode 中一样实现 New-File-dialog

ios - 编写自己的 iPad 照片库 - 释放错误

ios - 辛奇 iOS 应用程序 : Identifying if the app receives video or voice call

ios - 选择器没有从从 firebase 提取的数组中获取数据

string - 从 NSUserDefaults.standardUserDefaults().dictionaryRepresentation().keys 获取 [String]

iphone - 从 NSObject 类调用 ViewController 方法