Вызов статического метода в неизвестном типе класса
У меня есть интересная проблема, когда я пытаюсь вызвать методы класса для класса, о котором я практически ничего не знаю в своем тестовом методе. Я могу проверить его наследование и любые протоколы, которые он может реализовать, но не могу найти простой способ просто вызвать метод для него, не связываясь с NSInvocation. Приведенный ниже код, хотя и грубо, пытается продемонстрировать проблему, с которой я столкнулся.
@interface ClassA : NSObject
+ (Class)classIsPartialClassOf;
@end
@implementation ClassA
+ (Class)classIsPartialClassOf {
return [NSString class];
}
@end
@interface ClassB : NSObject
@end
@implementation ClassB
- (id)init {
[ClassB testClass:[ClassA class]];
}
+ (void)testClass:(Class)classDecl {
/* obviously if you know the type you can just call the method */
[ClassA classIsPartialClassOf];
/* but in my instance I do not know the type, obviously there are no classmethods to perform selector such as the fictional one below */
[classDecl performSelector:@selector(classIsPartialClassOf)];
}
@end
Методы для получения реализаций, кажется, возвращают варианты экземпляров, и я не могу заставить их запускать сам статический класс.
Мои возможности ограничены вызовами или я пропустил что-то очевидное и должен пнуть себя?
Спасибо заранее за вашу помощь.
2 ответа
"Методы для получения реализаций, кажется, возвращают варианты экземпляров, и я не могу заставить их запускать сам статический класс".
Тогда используйте objc_getMetaClass("ClassName")
вместо objc_getClass
, Объекты класса сами являются объектами и являются экземплярами их метакласса. Если вы передаете объект метакласса, например, class_getMethod()
, все будет отлично.
В чем проблема? Ваш код
[classDecl performSelector:@selector(classIsPartialClassOf)];
должно сработать. Как будет (проще написать)
[classDecl classIsPartialClassOf];
Объекты класса являются объектами. А методы класса - это просто методы, вызываемые для объекта класса.