2010-05-24 22 views
3

我想从类方法构建选择器。传递类方法作为选择器问题

我做这样说:

NavigationTreeActionHandler* handler=[NavigationTreeActionHandler self]; 
NavigationTreeNode* bombsNode=new NavigationTreeNode("Bombs","bigbomb.tif" 
    ,handler,@selector(BigBombButtonPressed:)); 

我需要传递给NavigationTreeNode目标和选择的目标的方法。 我尝试使用类对象的自我属性来获取目标(不知道htis是否是正确的方法)。然后我得到我想调用该类的类方法的选择器。

一切编译好的,但是当我用它失败:

[[handler class] instanceMethodSignatureForSelector:selector];

我得到一个零,真的不知道为什么......可能有人帮助吗?

+0

'[NavigationTreeActionHandler类]'是编写'[NavigationTreeActionHandler self]'的首选方式,但它不应该有所作为 – user102008 2011-07-22 23:27:32

回答

3

几点建议:

  • [NavigationTreeActionHandler self]将正常工作,以获取类对象,但我会宣布handlerid类型,而不是NavigationTreeActionHandler*,因为它不是一个实例的引用类型

  • [handler class]是多余的; handler已经是类对象。

  • instanceMethodSignatureForSelector:只会返回零,如果handler不执行selector。验证你的拼写等等,然后尝试抛出一个NSLog来验证你正在收到什么:

    NSLog(“handler =%@ sel =%@”,handler,NSStringFromSelector(selector));

但我不清楚你想要做什么instanceMethodSignatureForSelector:摆在首位。如果你只是想调用类的方法,不会0123'做你想要的吗?

1

很可能您使用的代码假定调用方法class将获得对象的类,并因此使用[[handler class] instanceMethodSignatureForSelector:selector]获取对象handler上选择器的方法签名。虽然这适用于普通对象,但对类对象不起作用,因为类对象上的class方法的含义不同,因为类方法+class覆盖实例方法-class+class只是返回它所调用的对象,而是它是(元类)的一个实例。

的解决方案是,你甚至都不需要获取类所有的,因为有你可以一个实例调用以获取其方法签名的方法:

[handler methodSignatureForSelector:selector] 

这是一个非常短更简单的做法,也适用于类对象。