121

Estoy tratando de obtener un nombre de cadena de una clase del objeto de clase en sí.Objective-C class -> string like: [NSArray className] -> @ "NSArray"

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

he encontrado object_getClassName(id obj) pero que requiere una instancia puede pasar a él, y en mi caso que es un trabajo innecesario.

Entonces, ¿cómo puedo obtener una cadena de un objeto de clase y no una instancia?

Respuesta

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

Puede incluso volver a la inversa:

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

Gracias! ¿Cómo se implementa 'NSStringFromClass'? ¿Es más eficiente almacenar el nombre de clase en una variable 'NSString estática '? – ma11hew28

+13

@MattDiPasquale: todos los nombres de clase se almacenan en algún lugar en el tiempo de ejecución de Objective-C (las partes internas del tiempo de ejecución se ocultan principalmente de la aplicación y se exponen solo a través de algunas funciones de API). Cada objeto de clase (por ejemplo, '[NSArray class]') es en realidad una 'struct'. La 'struct' contiene mucha información sobre la clase, incluyendo su nombre, los métodos que implementa, la superclase, etc.' NSStringFromClass' simplemente extrae el nombre de la clase de esta 'struct' y la convierte a' NSString' . No almacene el nombre de clase en 'NSString estático', no ofrecerá ninguna ventaja de rendimiento. – dreamlax

+3

@MattDiPasquale: 'NSClassFromString' funciona de forma diferente. Dado que todos los nombres de clase existen en algún lugar en el tiempo de ejecución de Objective-C, 'NSClassFromString' toma la cadena y explora la lista de clases mantenida por el tiempo de ejecución buscando la clase que tiene el nombre de pila. Si lo encuentra, lo devuelve; de ​​lo contrario, devuelve 'Nil'. – dreamlax

1

Aquí está una manera diferente a hacerlo con un poco menos de escribir:

NSString *name = [NSArray description]; 
+7

No se garantiza que haga lo que se solicita. Ese método comúnmente se omite para proporcionar una descripción del objeto y los datos que contiene. –

+3

Sé que está anulado como un método INSTANCE, pero ¿con qué frecuencia se reemplaza la + descripción CLASS MÉTODO? En cualquier caso, vale la pena considerarlo si no fuera por cada clase ... No creo que se requiera una rebaja. –

+2

Oh, buen punto. :) –

0

considerar esta alternativa:

const char *name = class_getName(cls); 

Es mucho más rápido, ya que no tiene por qué Asignar objeto NSString y convertir ASCII a cualquier representación NSString. Así es como se implementa NSStringFromClass().