如何确定选择器的参数/关键字的数量

时间:2009-12-12 14:59:01

标签: objective-c

我知道可以通过解码从sel_getName返回的选择器名称来完成。

但是我可以在运行时获得任何其他更方便的预加载信息吗?

2 个答案:

答案 0 :(得分:10)

请参阅NSMethodSignature的文档和-methodSignatureForSelector:的{​​{1}}方法。

您可以向对象询问它实现的任何选择器的方法签名,然后您可以向方法签名实例发送NSObject消息。

答案 1 :(得分:4)

**第一解决方案**

解决方案是混合使用Objective-C运行时函数和NSMethodSignature类。

首先,您需要包含一些标题

#include <objc/objc.h>
#include <objc/objc-class.h>
#include <objc/objc-runtime.h>

然后,无论你想要什么,从你的选择器开始,你得到参数的计数(注意每个方法都有两个隐含参数 self _cmd ,所以你必须不计算它们只有参数):

SEL sel = @selector(performSelector:onThread:withObject:waitUntilDone:);
Method m = class_getInstanceMethod([NSObject class], sel);
const char *encoding = method_getTypeEncoding(m);
NSMethodSignature *signature = [NSMethodSignature signatureWithObjCTypes:encoding];
int allCount = [signature numberOfArguments]; // The parameter count including the self and the _cmd ones
int parameterCount = allCount - 2; // Count only the method's parameters

**第二种解决方案**

将您的选择器转换为NSString并计算“:”字符。不确定它是否可靠。