Я хочу использовать это для объекта factory: с учетом строки создайте класс, и если этот класс поддерживает протокол (с помощью метода Create()), затем распределяет класс и вызывает Создать.
Цель C: Если задан идентификатор класса, могу ли я проверить, реализует ли этот класс определенный протокол? Или имеет определенный селектор?
Ответ 1
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)]
перед его вызовом.
Ответ 2
NSString *className; //assume this exists
Class class = NSClassFromString(className);
if ([class conformsToProtocol:@protocol(SomeProtocol)]) {
id instance = [[class alloc] init];
[instance create];
}