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

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

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 respondsToSelector:@selector(create)] прежде чем позвонить.

NSString *className; //assume this exists
Class class = NSClassFromString(className);
if ([class conformsToProtocol:@protocol(SomeProtocol)]) {
    id instance = [[class alloc] init];
    [instance create];
}
Другие вопросы по тегам