Objective C: Bei einer Klasse-ID kann ich überprüfen, ob diese Klasse implementiert ein bestimmtes Protokoll? Oder hat einen gewissen Wähler?

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

Frage

Das möchte ich für ein Objekt Fabrik verwenden: ein String gegeben, erstellen Sie eine Klasse, und wenn Diese Klasse unterstützt ein Protokoll (mit einer Methode Create ()), dann die Klasse Alloc und Call Erstellen.

War es hilfreich?

Lösung

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

May I jedoch nur darauf hinweisen, wie viele schreckliche Objective-C Sie brechen Regeln durch die oben tun? Zum Beispiel sollten Sie nie Methoden auf einer zugewiesenen-but-not-initialisierte Instanz anrufen. Der Xcode Static Analyzer geben Ihnen alle Arten von Warnungen über Speicherlecks.

Eine bessere Option wäre dies:

[[[klass alloc] init] create];

Aber Sie scheinen zu implizieren, dass Sie init nicht nennen wollen.

Sie können eine Klassenmethode betrachten: [klass create], die eine nicht im Besitz Instanz klass zurückkehren würde. Dann würden Sie nur [klass respondsToSelector:@selector(create)] überprüfen, bevor sie aufgerufen wird.

Andere Tipps

NSString *className; //assume this exists
Class class = NSClassFromString(className);
if ([class conformsToProtocol:@protocol(SomeProtocol)]) {
    id instance = [[class alloc] init];
    [instance create];
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top