Я хочу использовать это для объектной фабрики: Учитывая строку, создайте Класс, и если этот Класс поддерживает протокол (с Создаванием () метод) тогда выделение, класс и вызов Создают.
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)]
перед его вызовом.
NSString *className; //assume this exists
Class class = NSClassFromString(className);
if ([class conformsToProtocol:@protocol(SomeProtocol)]) {
id instance = [[class alloc] init];
[instance create];
}