我想从类方法构建一个选择器。
我这样做:
NavigationTreeActionHandler* handler=[NavigationTreeActionHandler self];
NavigationTreeNode* bombsNode=new NavigationTreeNode("Bombs","bigbomb.tif"
,handler,@selector(BigBombButtonPressed:));
我需要将目标和选择器传递给NavigationTreeNode到目标方法。 我尝试使用类对象的self属性获取目标(不知道htis是否是正确的方法)。然后我得到了我想在类上调用的类方法的选择器。
所有内容编译好,但是当我使用时它会失败:
[[handler class] instanceMethodSignatureForSelector:selector];
我得到一个零并且不知道为什么......有人可以帮忙吗?
答案 0 :(得分:3)
一些建议:
[NavigationTreeActionHandler self]
可以很好地获取类对象,但我会将handler
声明为类型id
而不是NavigationTreeActionHandler*
,因为它不是对[handler class]
的引用键入
handler
是多余的; instanceMethodSignatureForSelector:
已经是类对象。
handler
未实现selector
,则 instanceMethodSignatureForSelector:
仅返回nil。验证您的拼写等,并尝试投入NSLog来验证您收到的内容:
NSLog(“handler =%@ sel =%@”,handler,NSStringFromSelector(selector));
但我不清楚你最初想要用[handler performSelector:selector];
做些什么。如果你只是试图调用类方法,那么{{1}}不会做你想要的吗?
答案 1 :(得分:1)
您可能正在使用的代码假设调用方法class
将获取对象的类,因此使用[[handler class] instanceMethodSignatureForSelector:selector]
来获取对象{{1}上的选择器的方法签名}。虽然这适用于普通对象,但这对类对象不起作用,因为类对象上handler
方法的含义不同,因为类方法class
会覆盖实例方法+class
,-class
只返回它所调用的对象,而不是它是(元类)实例的类。
解决方案是您根本不需要获取类,因为有一种方法可以调用实例来获取其方法签名:
+class
这是一种更简单,更简单的方式,可以用于实现目标,也适用于类对象。