Цель С :Учитывая идентификатор класса, могу ли я проверить, реализует ли этот класс определенный протокол?Или имеет определенный селектор?
-
23-09-2019 - |
Вопрос
Я хочу использовать это для фабрики объектов:Получив строку, создайте класс, и если этот класс поддерживает протокол (с помощью метода Create()), то выделите класс и вызовите Создать.
Решение
Class klass = NSClassFromString(classname);
if ([klass instancesRespondToSelector:@selector(create)]) {
[[klass alloc] create];
}
Могу ли я, однако, указать, сколько ужасных правил Objective-C вы нарушаете, делая вышеописанное?Например, вы никогда не должны вызывать методы в выделенном, но не инициализированном экземпляре.Статический анализатор Xcode выдаст вам всевозможные предупреждения об утечках памяти.
Лучшим вариантом было бы следующее:
[[[klass alloc] init] create];
Но вы, кажется, подразумеваете, что не хотите вызывать init.
Вы могли бы рассмотреть метод класса: [klass create]
, который вернул бы не принадлежащий экземпляр klass
.Тогда вы бы просто проверили [klass respondsToSelector:@selector(create)]
прежде чем вызвать его.
Другие советы
NSString *className; //assume this exists
Class class = NSClassFromString(className);
if ([class conformsToProtocol:@protocol(SomeProtocol)]) {
id instance = [[class alloc] init];
[instance create];
}