2009-12-12 25 views

回答

10

请参阅文档NSMethodSignature-methodSignatureForSelector:方法NSObject

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

+2

如果目标或目标类别都未知,该怎么办? – Kentzo 2013-02-22 10:26:22

4

**第一解**

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

首先,你需要包含一些头

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

然后,无论你想,从你的选择,你得到的参数的数量(请注意,每个方法有两个隐含参数自我_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并计算“:”字符。不确定它是否可靠。

+1

为什么不只是'NSMethodSignature *签名= [NSObject instanceMethodSignatureForSelector:sel];' – user102008 2012-04-20 17:39:21

+0

计算冒号将起作用,至少在1989年以来我见过的每一个Obj-C版本都可以使用。;-) – NSResponder 2013-02-25 23:36:03