131 votes

Classe Objective-C -> chaîne de caractères comme : [NSArray className] -> @"NSArray"

J'essaie d'obtenir le nom d'une classe à partir de l'objet de la 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 passée, et dans mon cas, c'est un travail inutile.

Donc, comment puis-je obtenir une chaîne de caractères à partir d'un objet de classe, et no une instance ?

310voto

dreamlax Points 47152
NSString *name = NSStringFromClass ([NSArray class]);

Vous pouvez même faire le chemin inverse :

Class arrayClass = NSClassFromString (name);
id anInstance = [[arrayClass alloc] init];

0 votes

Merci ! Comment est NSStringFromClass mis en œuvre ? Est-il plus performant de stocker le nom de la classe dans un fichier static NSString variable ?

13 votes

@MattDiPasquale : Tous les noms de classe sont stockés quelque part dans le runtime Objective-C (les éléments internes du runtime sont pour la plupart cachés à l'application et ne sont exposés qu'à travers quelques fonctions de l'API). Chaque objet de classe (par exemple [NSArray class] ) est en fait un struct . Le site struct contient de nombreuses informations sur la classe, notamment son nom, les méthodes qu'elle implémente, la superclasse, etc. NSStringFromClass tire juste le nom de la classe à partir de ceci struct et le convertit en un NSString . Ne stockez pas le nom de la classe dans un static NSString il n'offre aucun avantage en termes de performances.

3 votes

@MattDiPasquale : NSClassFromString fonctionne un peu différemment. Puisque tous les noms de classes existent quelque part dans le runtime Objective-C, NSClassFromString prend la chaîne de caractères et explore la liste des classes maintenue par le runtime à la recherche de la classe qui porte le nom donné. Si elle la trouve, elle la renvoie, sinon elle renvoie Nil .

2voto

wonder.mice Points 1333

Considérez cette alternative :

const char *name = class_getName(cls);

Il est beaucoup plus rapide, puisqu'il n'a pas besoin d'allouer l'objet NSString et de convertir l'ASCII en quelque chose de différent. NSString la représentation est. C'est ainsi que NSStringFromClass() est mis en œuvre.

2voto

Sherwin Zadeh Points 153

Voici une autre façon de le faire avec un peu moins de frappe :

NSString *name = [NSArray description];

7 votes

Ce n'est pas garanti de faire ce qui est demandé. Cette méthode est généralement surchargée pour fournir une description de l'objet et des données qu'il contient.

3 votes

Je sais qu'elle est remplacée par une méthode INSTANCE mais combien de fois la +description CLASS METHOD est-elle remplacée ? En tout cas, cela vaut la peine d'être considéré, même si ce n'est pas pour toutes les classes... Je ne pense pas qu'un downgrade était nécessaire.

3 votes

@SherwinZadeh : Je pense qu'en pratique, il est peu probable que vous trouviez des classes qui ont surchargé le paramètre +description Cependant, en théorie, ce n'est pas le but de l'opération. +description Cette méthode est donc fragile pour déterminer les noms des classes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X