我知道可以通过解码从sel_getName返回的选择器名称来完成。
但是我可以在运行时获得任何其他更方便的预加载信息吗?
答案 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并计算“:”字符。不确定它是否可靠。