将类方法作为选择器问题传递

时间:2010-05-24 12:07:05

标签: objective-c

我想从类方法构建一个选择器。

我这样做:

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

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

所有内容编译好,但是当我使用时它会失败:

[[handler class] instanceMethodSignatureForSelector:selector];

我得到一个零并且不知道为什么......有人可以帮忙吗?

2 个答案:

答案 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

这是一种更简单,更简单的方式,可以用于实现目标,也适用于类对象。