2009-12-12 26 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