通过NSClassFromString()返回的Class调用类方法

5

NSClassFromString(aClassName)会返回一个名为aClassName的类的类对象。很好。

那么我怎样才能在这个类对象上调用类方法呢?

  Class moduleClass = NSClassFromString(aClassName);

Xcode不允许我调用

  AppModule* appModuleClass = moduleClass;
  [appModuleClass classMethod]     // actually that's an object instance...

或者

  [((AppModule)moduleClass) classMethod];     // C-style cast not allowed

这里我有什么遗漏吗?谢谢。

1
直接在 moduleClass 上调用选择器 [moduleClass classMethod] 也不起作用吗? - Rich
我只是问一下,因为以下代码不会引起任何问题:Class cls = NSClassFromString(@"NSString"); NSString *s = [cls stringWithString:@"A string"]; - Rich
@Rich 嗯,这是Objective-C,所以当然可以工作,但在编译时会产生一个警告。 - ATV
1
我是指编译和运行时。以上代码没有产生警告,没有错误,并且可以正常运行。你可以试一下。 - Rich
2个回答

5

调用类方法,可以这样做:

[NSClassFromString(aClassName) performSelector:@selector(classMethod)];

也许这个可以解决问题:

objc_msgSend(NSClassFromString(aClassName), @selector(classMethod));

那仍然是调用实例方法。我需要调用类方法。请参见我的问题中的第一个示例。 - ATV
好的,干杯!除了...我需要使用非对象参数调用一个方法,而且我想避免使用NSInvocation - 难道没有直接调用该方法的方法吗..? - ATV
尝试这个:objc_msgSend(NSClassFromString(aClassName), @selector(classMethod)); - idmean
确切地说,我最终使用了类似于https://dev59.com/WFTTa4cB1Zd3GeqPow9W?rq=1中所建议的方法。 - ATV
如果有3-4个参数,是否可以将这些参数传递给这些调用? - Tom Hammond
@TomHammond 是的,有这个功能。它是一个可变参数函数,只需在选择器后传递参数即可。https://developer.apple.com/reference/objectivec/1456712-objc_msgsend - idmean

0

您可以使用

__typeof([AppModule class]) cls = NSClassFromString(@"aClassName");
if ( [cls respondsToSelector:@selector(classMethod)] ) {
    [cls classMethod];
}

1
虽然这段代码可能回答了问题,但提供有关它如何以及/或为什么解决问题的附加上下文将改善答案的长期价值。 - Nic3500

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