J'essaie d'obtenir un nom de chaîne d'une classe à partir de l'objet de classe lui-même.
// For instance
[NSArray className]; // @"NSArray"
J'ai trouvé object_getClassName(id obj)
mais cela nécessite qu'une instance lui soit transmise, et dans mon cas, c'est un travail inutile.
Alors, comment puis-je obtenir une chaîne à partir d'un objet de classe et non d' une instance?
NSStringFromClass
mis en œuvre? Est-il plus performant de stocker le nom de la classe dans unestatic NSString
variable?[NSArray class]
) est en fait unstruct
. Lestruct
contient beaucoup d'informations sur la classe, y compris son nom, les méthodes qu'elle implémente, la superclasse, etc. enNSStringFromClass
tire simplement le nom de la classestruct
et le convertit en un fichierNSString
. Ne stockez pas le nom de la classe dans unstatic NSString
, cela n'offrira aucun avantage en termes de performances.NSClassFromString
fonctionne un peu différemment. Étant donné que tous les noms de classe existent quelque part dans le runtime Objective-C,NSClassFromString
prend la chaîne et explore la liste des classes maintenues par le runtime à la recherche de la classe qui porte le nom donné. S'il le trouve, il le renvoie, sinon il retourneNil
.class_getName()
dans le runtime, qui renvoie une chaîne CclassName
est une méthode ajoutée par les extensions de script qui n'est disponible que sur Mac OS X, même dans ce cas, elle est capricieuse dans son fonctionnement car elle n'est pas entièrement documentée (ou du moins ce n'était pas la dernière fois que j'ai vérifié).NSStringFromClass()
est la bonne façon de procéder.Voici une façon différente de le faire avec un peu moins de frappe:
la source
+description
, cependant, en théorie, ce n'est pas le but+description
, et cette méthode est donc fragile pour déterminer les noms de classe.Considérez cette alternative:
C'est beaucoup plus rapide, car il n'a pas besoin d'allouer un objet NSString et de convertir ASCII en une
NSString
représentation quelconque . Voilà commentNSStringFromClass()
est mis en œuvre.la source