从选择器变量中找到参数类/类型 - Objective-C

3
我正在处理一个涉及将选择器作为变量发送以供稍后使用的类。该选择器要求接受一个BOOL值参数。可按如下方式执行:
IMP imp = [ob methodForSelector:selector];
void (*func)(id, SEL, BOOL) = (void *)imp;
func(ob, selector, YES);

如果有人尝试使用与BOOL不匹配的变量设置选择器,我希望返回一个错误。在接收选择器时,是否有一种方法可以检查其参数是否为BOOL,或者通常情况下,已传递哪个类或类型的参数?
为什么要这样做呢?
我正在其中一个类中设置准通知中心,以便我可以轻松地添加观察者并更好地控制信息分发。
1个回答

2

看一下方法签名:

NSMethodSignature * sig = [ob methodSignatureForSelector:selector];
NSAssert(0 == strcmp(@encode(BOOL), [sig getArgumentTypeAtIndex:2]),
         @"Method must take a BOOL as its sole argument.");

谢谢@Josh,这个完美地解决了!您介意也展示一下我如何为一个对象做到这一点吗? - Logan
只需将@encode()中的BOOL更改为id(或类名,但任何类名都会编码为与id相同的内容)。 - jscs
索引2的调用很好。我总是忘记self和_cmd作为默认参数,直到我花了10分钟咒骂并翻转我的显示器。 - ryan cumley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接