Вызов метода класса для класса, возвращаемого NSClassFromString()

NSClassFromString(aClassName) возвращает объект класса класса с именем aClassName. Здорово.

Теперь, как я могу вызвать метод класса для этого объекта класса? За

  Class moduleClass = NSClassFromString(aClassName);

Xcode не позволит мне позвонить

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

or

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

Что мне здесь не хватает? Спасибо.


person ATV    schedule 26.04.2014    source источник
comment
Прямой вызов селектора на moduleClass тоже не работает - [moduleClass classMethod]?   -  person Rich    schedule 26.04.2014
comment
Спрашиваю только, так как следующее не вызывает проблем: Class cls = NSClassFromString(@"NSString"); NSString *s = [cls stringWithString:@"A string"];   -  person Rich    schedule 26.04.2014
comment
@Rich Ну, это Objective-C, так что, конечно, он работает, но во время компиляции выдает предупреждение.   -  person ATV    schedule 26.04.2014
comment
Я имел в виду компиляцию и выполнение. Вышеприведенное не выдает никаких предупреждений, ошибок и работает нормально. Попробуй.   -  person Rich    schedule 26.04.2014


Ответы (2)


Чтобы вызвать метод класса, сделайте так:

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

Возможно, это может работать:

objc_msgSend(NSClassFromString(aClassName), @selector(classMethod));
person idmean    schedule 26.04.2014
comment
Это по-прежнему вызывает метод экземпляра. Мне нужно вызвать метод класса. См. 1. пример в моем вопросе. - person ATV; 26.04.2014
comment
Хорошо, ура! За исключением... Мне нужно на самом деле вызвать метод с аргументом, не являющимся объектом, и я хотел бы избежать NSInvocation - нет ли способа напрямую вызвать метод...? - person ATV; 26.04.2014
comment
Попробуйте это: objc_msgSend(NSClassFromString(aClassName), @selector(classMethod)); - person idmean; 26.04.2014
comment
Точно, я использовал что-то в этом роде, как было предложено stackoverflow.com/questions/4909972/ - person ATV; 26.04.2014
comment
Можно ли в эти вызовы передавать параметры, если параметров 3-4? - person Tom Hammond; 18.01.2017
comment
@TomHammond Да, есть. Это функция с переменным числом аргументов, просто передайте аргументы после селектора. developer.apple.com/reference/objectivec/1456712-objc_msgsend - person idmean; 18.01.2017

Ты можешь использовать

__typeof([AppModule class]) cls = NSClassFromString(@"aClassName");
if ( [cls respondsToSelector:@selector(classMethod)] ) {
    [cls classMethod];
}
person Su Chale    schedule 10.08.2018
comment
Хотя этот код может дать ответ на вопрос, предоставление дополнительного контекста относительно того, как и/или почему он решает проблему, улучшит долгосрочную ценность ответа. - person Nic3500; 10.08.2018