Ist es möglich, eine Instanz einer Klasse nach Namen zu erstellen? Etwas wie:
NSString* className = @"Car";
id* p = [Magic createClassByName:className];
[p turnOnEngine];
Ich weiß nicht, ob dies in Ziel-C möglich ist, aber es scheint so,
Ist es möglich, eine Instanz einer Klasse nach Namen zu erstellen? Etwas wie:
NSString* className = @"Car";
id* p = [Magic createClassByName:className];
[p turnOnEngine];
Ich weiß nicht, ob dies in Ziel-C möglich ist, aber es scheint so,
Antworten:
id object = [[NSClassFromString(@"NameofClass") alloc] init];
NSClassFromString()
Es besteht die Gefahr, dass der Klassenname falsch eingegeben oder eine nicht vorhandene Klasse verwendet wird. Sie werden erst zur Laufzeit herausfinden, ob Sie diesen Fehler machen. Wenn Sie stattdessen den integrierten Ziel-c-Typ von verwenden Class
, um eine Variable zu erstellen, überprüft der Compiler, ob die Klasse vorhanden ist.
Zum Beispiel in Ihrem .h
:
@property Class NameOfClass;
und dann in Ihrem .m
:
id object = [[NameOfClass alloc] init];
Wenn Sie den Klassennamen falsch eingegeben haben oder nicht vorhanden sind, wird beim Kompilieren eine Fehlermeldung angezeigt. Ich denke auch, dass dies sauberer Code ist.
Wenn Sie mit Objective-C ohne arbeiten NeXTstep
( OS X
, iOS
, GNUstep
etc) System oder Sie denken , nur diese Methode sauberer ist, dann könnte man die nutzen Sprache Objective-C - Laufzeitbibliothek API . Unter Objective-C 2.0
:
#import <objc/runtime.h>
//Declaration in the above named file
id objc_getClass(const char* name);
//Usage
id c = objc_getClass("Object");
[ [ c alloc ] free ];
Unter Objective-C (1.0 oder unbenannte Version) würden Sie Folgendes verwenden:
#import <objc/objc-api.h>
//Declaration within the above named file
Class objc_get_class( const char* name);
//Usage
Class cls = objc_get_class( "Test" );
id obj = class_create_instance( cls );
[ obj free ];
Ich habe die 1.0
Version nicht getestet , aber ich habe die 2.0
Funktion in Code verwendet, der jetzt in Produktion ist. Ich persönlich glaube, dass die Verwendung der 2.0
Funktion sauberer ist, wenn sie verfügbar ist als die NS-Funktion, da sie weniger Speicherplatz beansprucht: the length of the name in bytes + 1 ( null terminator )
für die 2.0-API im Vergleich zu the sum of two pointers (isa, cstring)
a size_t length (cstring_length)
und length of the string in bytes + 1
für die NeXTSTEP
API.