Ich versuche, einen Zeichenfolgennamen einer Klasse aus dem Klassenobjekt selbst abzurufen.
// For instance
[NSArray className]; // @"NSArray"
Ich habe festgestellt, object_getClassName(id obj)
aber dafür muss eine Instanz übergeben werden, und in meinem Fall ist das unnötige Arbeit.
Wie kann ich also eine Zeichenfolge aus einem Klassenobjekt und nicht aus einer Instanz abrufen?
NSStringFromClass
umgesetzt? Ist es performanter, den Klassennamen in einerstatic NSString
Variablen zu speichern ?[NSArray class]
) ist tatsächlich einstruct
. Dasstruct
enthält viele Informationen über die Klasse, einschließlich ihres Namens, der implementierten Methoden, der Oberklasse usw.,NSStringFromClass
zieht einfach den Namen der Klasse darausstruct
und konvertiert ihn in einenNSString
. Speichern Sie den Klassennamen nicht in astatic NSString
, da dies keinen Leistungsvorteil bietet.NSClassFromString
funktioniert etwas anders. Da alle Klassennamen irgendwo in der Objective-C-Laufzeit vorhanden sind,NSClassFromString
wird die Zeichenfolge verwendet und die Liste der von der Laufzeit verwalteten Klassen durchsucht, um nach der Klasse mit dem angegebenen Namen zu suchen. Wenn es es findet, gibt es es zurück, andernfalls gibt es zurückNil
.class_getName()
in der Laufzeit verwendet, die einen C-StringclassName
ist eine Methode, die von den Skripterweiterungen hinzugefügt wurde und nur unter Mac OS X verfügbar ist. Selbst dann ist die Funktionsweise schwierig, da sie nicht vollständig dokumentiert ist (oder zumindest nicht das letzte Mal, dass ich sie überprüft habe).NSStringFromClass()
ist der richtige Weg, um es zu tun.Hier ist eine andere Möglichkeit, dies mit etwas weniger Eingabe zu tun:
quelle
+description
wurden. Theoretisch ist dies jedoch nicht der Zweck+description
, und daher ist diese Methode für die Bestimmung von Klassennamen fragil.Betrachten Sie diese Alternative:
Es ist viel schneller, da es kein NSString-Objekt zuordnen und ASCII in eine beliebige
NSString
Darstellung konvertieren muss . SoNSStringFromClass()
wird es umgesetzt.quelle