Objective C: Bei einer Klasse-ID kann ich überprüfen, ob diese Klasse implementiert ein bestimmtes Protokoll? Oder hat einen gewissen Wähler?
-
23-09-2019 - |
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.
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];
}