2010-02-25 14 views
121

J'essaie d'obtenir un nom de chaîne d'une classe à partir de l'objet de classe lui-même.Objective-C class -> Chaîne semblable à: [NSArray className] -> @ "NSArray"

// For instance 
[NSArray className]; // @"NSArray" 

J'ai trouvé object_getClassName(id obj) mais qui nécessite une instance soit passée à, et dans mon cas qui est un travail inutile.

Alors, comment puis-je obtenir une chaîne à partir d'un objet de classe, et pas une instance?

Répondre

291
NSString *name = NSStringFromClass ([NSArray class]); 

Vous pouvez même revenir dans l'autre sens:

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

Merci! Comment 'NSStringFromClass' est-il implémenté? Est-il plus performant de stocker le nom de classe dans une variable 'static NSString'? – ma11hew28

+13

@MattDiPasquale: Tous les noms de classe sont stockés quelque part dans l'environnement d'exécution Objective-C (les composants internes de l'environnement d'exécution sont généralement masqués dans l'application et exposés uniquement via quelques fonctions API). Chaque objet de classe (par exemple '[classe NSArray]') est en fait un 'struct'. Le 'struct' contient beaucoup d'informations sur la classe, y compris son nom, les méthodes qu'elle implémente, la superclasse, etc.' NSStringFromClass' tire juste le nom de la classe de cette 'struct' et la convertit en' NSString' . Ne stockez pas le nom de classe dans un 'NSString statique ', il n'offrira aucun avantage de performance. – dreamlax

+3

@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 et explore la liste des classes maintenues par le moteur d'exécution recherchant la classe qui a le nom donné. S'il le trouve, il le renvoie, sinon il renvoie 'Nil'. – dreamlax

1

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

NSString *name = [NSArray description]; 
+7

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

Je sais qu'il est surchargé en tant que méthode INSTANCE mais à quelle fréquence la méthode + CLASS est-elle surchargée? En tout cas, il vaut la peine d'envisager si ce n'est pour chaque classe ... Je ne pense pas qu'un déclassement était nécessaire. –

+2

Oh, bon point. :) –

0

Tenir compte cette alternative:

const char *name = class_getName(cls); 

C'est beaucoup plus rapide, car il n'a pas à allouer l'objet NSString et convertir l'ASCII à la représentation NSString. C'est ainsi que NSStringFromClass() est implémenté.