如何获得一个类方法的选择器?

亚历山大·佩列涅夫(Alexander Perechnev)

我在下一个代码中获得指向实例方法的指针:

#import <Foundation/Foundation.h>
#import <objc/runtime.h>

@interface TestClass : NSObject
@end

@implementation TestClass
- (void)someMethod { // This is instance method, it's okay
  NSLog(@"Hello from some method!");
}
@end

int main(int argc, const char * argv[]) {
  typedef void (*MethodWithoutParams)();
  MethodWithoutParams someMethodImplementation = 
class_getMethodImplementation([TestClass class], @selector(someMethod));
  someMethodImplementation();
  return 0;
}

效果很好。但是,如果我想获得指向类方法的指针,它将无法正常工作:

#import <Foundation/Foundation.h>
#import <objc/runtime.h>

@interface TestClass : NSObject
@end

@implementation TestClass
+ (void)someMethod { // This is class method, it doesn't work
  NSLog(@"Hello from some method!");
}
@end

int main(int argc, const char * argv[]) {
  typedef void (*MethodWithoutParams)();
  MethodWithoutParams someMethodImplementation = 
class_getMethodImplementation([TestClass class], @selector(someMethod));
  someMethodImplementation();
  return 0;
}

它无法工作,因为它无法查找方法的实现。

我确信它一定能正常工作,因为如果我以这种方式获得实现,它将能够正常工作:

MethodWithoutParams someMethodImplementation = 
[TestClass methodForSelector:@selector(someMethod)];

因此,我研究了NSObject的实现,然后看下面的代码:

+ (IMP)methodForSelector:(SEL)sel {
    if (!sel) [self doesNotRecognizeSelector:sel];
    return object_getMethodImplementation((id)self, sel);
}

- (IMP)methodForSelector:(SEL)sel {
    if (!sel) [self doesNotRecognizeSelector:sel];
    return object_getMethodImplementation(self, sel);
}

object_getMethodImplementation()函数下一次执行:

IMP object_getMethodImplementation(id obj, SEL name)
{
    Class cls = (obj ? obj->getIsa() : nil);
    return class_getMethodImplementation(cls, name);
}

因此,类方法查找和实例方法查找的实现是相同的。

但这是行不通的,我也不知道为什么。我猜想任何类型的方法(类和实例)都将位于调度表中,并且我可以获取指向任何此类方法的指针。但是如您所见,我做不到。

肯·托马斯(Ken Thomases)

您需要查询类的元类。类方法是其元类上的实例方法。

Class meta = objc_getMetaClass("TestClass");
SEL sel = @selector(someMethod);
typedef void (*MyMethodImplementation)(Class, SEL);
MyMethodImplementation someMethodImplementation = (MyMethodImplementation)class_getMethodImplementation(meta, sel);
someMethodImplementation([TestClass class], sel);

注意,方法(实例或类)永远不会“没有参数”。必须始终至少使用接收者(实例或类)和选择器来调用它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何获得一个类方法的选择器?

来自分类Dev

获得一个时间选择器

来自分类Dev

一个类调用另一个类的方法(nstimer),该方法无法调用选择器

来自分类Dev

如何在多个类作为一个类的jQuery中使用not选择器

来自分类Dev

如何重写另一个包中的类中的现有选择器

来自分类Dev

如何在CSS伪类选择器中排除最后一个孩子

来自分类Dev

如何将多个CSS类选择器组合为一个?

来自分类Dev

如何通过另一个类在链中扩展顶级选择器

来自分类Dev

Swift 2:UIPinchGestureRecognizer中的选择器:如何从另一个类访问func

来自分类Dev

如何从选择器中获取一个元素

来自分类Dev

如何从选择器中获取一个元素

来自分类Dev

当我的选择器有一个伪类时,如何追加到类名上?

来自分类Dev

如何在此javascript代码(图像选择器)中获得另一个值?

来自分类Dev

最后一个选择器

来自分类Dev

选择器“:global .class”不是纯的(纯选择器必须至少包含一个本地类或ID)

来自分类Dev

在当前选择器之后选择下一个出现的类

来自分类Dev

如何将CSS星形选择器*限制为一个类和所有后代?

来自分类Dev

如何使用material-ui为复杂的选择器引用另一个样式类

来自分类Dev

如何使用LESS将多个Font Awesome类组合到一个选择器中?

来自分类Dev

如何使用 Jquery 和类选择器获取元素第一个子文本?

来自分类Dev

在特定选择器中附加 div 并获得第一个

来自分类Dev

CSS选择器,选择一个类,但该类的第一个匹配项除外

来自分类Dev

如何制作一个OR选择器而不是一个AND语句

来自分类Dev

如果取消选择一个输入,如何取消选择“所有”选择器

来自分类Dev

如何选择一个日期选择器的minDate到用户选择的日期

来自分类Dev

如何获得CSS类选择器以覆盖input [readonly]选择器?

来自分类Dev

如何设置一个日期选择器选择的日期是扑扑另一个日期选择器的第一日期

来自分类Dev

如何获得一个类的构造方法?

来自分类Dev

类的第一个元素的CSS选择器

Related 相关文章

  1. 1

    如何获得一个类方法的选择器?

  2. 2

    获得一个时间选择器

  3. 3

    一个类调用另一个类的方法(nstimer),该方法无法调用选择器

  4. 4

    如何在多个类作为一个类的jQuery中使用not选择器

  5. 5

    如何重写另一个包中的类中的现有选择器

  6. 6

    如何在CSS伪类选择器中排除最后一个孩子

  7. 7

    如何将多个CSS类选择器组合为一个?

  8. 8

    如何通过另一个类在链中扩展顶级选择器

  9. 9

    Swift 2:UIPinchGestureRecognizer中的选择器:如何从另一个类访问func

  10. 10

    如何从选择器中获取一个元素

  11. 11

    如何从选择器中获取一个元素

  12. 12

    当我的选择器有一个伪类时,如何追加到类名上?

  13. 13

    如何在此javascript代码(图像选择器)中获得另一个值?

  14. 14

    最后一个选择器

  15. 15

    选择器“:global .class”不是纯的(纯选择器必须至少包含一个本地类或ID)

  16. 16

    在当前选择器之后选择下一个出现的类

  17. 17

    如何将CSS星形选择器*限制为一个类和所有后代?

  18. 18

    如何使用material-ui为复杂的选择器引用另一个样式类

  19. 19

    如何使用LESS将多个Font Awesome类组合到一个选择器中?

  20. 20

    如何使用 Jquery 和类选择器获取元素第一个子文本?

  21. 21

    在特定选择器中附加 div 并获得第一个

  22. 22

    CSS选择器,选择一个类,但该类的第一个匹配项除外

  23. 23

    如何制作一个OR选择器而不是一个AND语句

  24. 24

    如果取消选择一个输入,如何取消选择“所有”选择器

  25. 25

    如何选择一个日期选择器的minDate到用户选择的日期

  26. 26

    如何获得CSS类选择器以覆盖input [readonly]选择器?

  27. 27

    如何设置一个日期选择器选择的日期是扑扑另一个日期选择器的第一日期

  28. 28

    如何获得一个类的构造方法?

  29. 29

    类的第一个元素的CSS选择器

热门标签

归档