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,
objective-c
reflection
Kennzeichen
quelle
quelle
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 verwendenClass
, um eine Variable zu erstellen, überprüft der Compiler, ob die Klasse vorhanden ist.Zum Beispiel in Ihrem
.h
:und dann in Ihrem
.m
: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.
quelle
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 . UnterObjective-C 2.0
:Unter Objective-C (1.0 oder unbenannte Version) würden Sie Folgendes verwenden:
Ich habe die
1.0
Version nicht getestet , aber ich habe die2.0
Funktion in Code verwendet, der jetzt in Produktion ist. Ich persönlich glaube, dass die Verwendung der2.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 zuthe sum of two pointers (isa, cstring)
asize_t length (cstring_length)
undlength of the string in bytes + 1
für dieNeXTSTEP
API.quelle
Dann, um es zu benutzen:
quelle