Подтвердить что ты не робот

Цель C: Если задан идентификатор класса, могу ли я проверить, реализует ли этот класс определенный протокол? Или имеет определенный селектор?

Я хочу использовать это для объекта factory: с учетом строки создайте класс, и если этот класс поддерживает протокол (с помощью метода Create()), затем распределяет класс и вызывает Создать.

4b9b3361

Ответ 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];
}