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

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

Ответы [ 2 ]

265 голосов
/ 26 февраля 2010
NSString *className; //assume this exists
Class class = NSClassFromString(className);
if ([class conformsToProtocol:@protocol(SomeProtocol)]) {
    id instance = [[class alloc] init];
    [instance create];
}
15 голосов
/ 26 февраля 2010
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)], прежде чем позвонить.

...