39 Stimmen

Objective C : Kann ich anhand einer Klassen-ID überprüfen, ob diese Klasse ein bestimmtes Protokoll implementiert? Oder einen bestimmten Selektor hat?

Ich möchte dies für eine Objektfabrik verwenden: Anhand einer Zeichenkette eine Klasse erstellen, und wenn diese Klasse ein Protokoll unterstützt (mit einer Create()-Methode), dann ordnen Sie die Klasse zu und rufen Erstellen.

271voto

Chuck Punkte 228137
NSString *className; //assume this exists
Class class = NSClassFromString(className);
if ([class conformsToProtocol:@protocol(SomeProtocol)]) {
    id instance = [[class alloc] init];
    [instance create];
}

15voto

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

Darf ich Sie jedoch darauf hinweisen, wie viele schreckliche Objective-C-Regeln Sie mit dem oben genannten Vorgehen verletzen? Zum Beispiel sollten Sie niemals Methoden auf einer zugewiesenen, aber nicht initialisierten Instanz aufrufen. Der Xcode Static Analyzer gibt Ihnen alle Arten von Warnungen über Speicherlecks.

Eine bessere Option wäre diese:

[[[klass alloc] init] create];

Aber Sie scheinen anzudeuten, dass Sie init nicht anrufen wollen.

Sie könnten eine Klassenmethode in Betracht ziehen: [klass create] was eine nicht-eigene Instanz von klass . Dann würden Sie einfach überprüfen [klass respondsToSelector:@selector(create)] bevor Sie es aufrufen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X