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

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

38
задан BJ Homer 26 February 2010 в 21:02
поделиться

2 ответа

Class klass = NSClassFromString(classname);
if ([klass instancesRespondToSelector:@selector(create)]) {
  [[klass alloc] create];
}

Однако позвольте мне указать, сколько ужасных правил Objective-C вы нарушаете, выполняя описанное выше? Например, вы никогда не должны вызывать методы для выделенного, но не инициализированного экземпляра. Статический анализатор Xcode выдаст вам всевозможные предупреждения об утечках памяти.

Лучшим вариантом будет такой:

[[[klass alloc] init] create];

Но вы, кажется, подразумеваете, что не хотите вызывать init.

Вы можете рассмотреть метод класса: [klass create] , который вернет не принадлежащий ему экземпляр klass . Тогда вы должны просто проверить [klass responseToSelector: @selector (create)] перед его вызовом.

15
ответ дан 27 November 2019 в 02:55
поделиться
NSString *className; //assume this exists
Class class = NSClassFromString(className);
if ([class conformsToProtocol:@protocol(SomeProtocol)]) {
    id instance = [[class alloc] init];
    [instance create];
}
268
ответ дан 27 November 2019 в 02:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: