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

StackOverflow https://stackoverflow.com/questions/2344672

Вопрос

Я хочу использовать это для фабрики объектов:Получив строку, создайте класс, и если этот класс поддерживает протокол (с помощью метода 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];
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top