Estoy tratando de obtener un nombre de cadena de una clase del propio objeto de clase.
// For instance
[NSArray className]; // @"NSArray"
He encontrado, object_getClassName(id obj)
pero eso requiere que se le pase una instancia, y en mi caso es un trabajo innecesario.
Entonces, ¿cómo puedo obtener una cadena de un objeto de clase, y no una instancia?
NSStringFromClass
implementa? ¿Es más eficiente almacenar el nombre de la clase en unastatic NSString
variable?[NSArray class]
) es en realidad unstruct
. Elstruct
contiene una gran cantidad de información acerca de la clase, incluyendo su nombre, los métodos que implementa, la superclase, etc.NSStringFromClass
simplemente tira del nombre de la clase de estastruct
y la convierte en unaNSString
. No almacene el nombre de la clase en unstatic NSString
, no ofrecerá ninguna ventaja de rendimiento.NSClassFromString
funciona un poco diferente. Dado que todos los nombres de clase existen en algún lugar del 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 dado. Si lo encuentra, lo devuelve, de lo contrario, vuelveNil
.class_getName()
en el tiempo de ejecución, que devuelve una cadena CclassName
es un método agregado por las extensiones de secuencias de comandos que solo está disponible en Mac OS X, incluso entonces es complicado en cómo funciona porque no está completamente documentado (o al menos no fue la última vez que lo verifiqué).NSStringFromClass()
es la forma correcta de hacerlo.Aquí hay una forma diferente de hacerlo con un poco menos de tipeo:
fuente
+description
, sin embargo, en teoría, este no es el propósito+description
, por lo que este método es frágil para determinar los nombres de clase.Considere esta alternativa:
Es mucho más rápido, ya que no tiene que asignar objetos NSString y convertir ASCII a cualquier
NSString
representación. Así es comoNSStringFromClass()
se implementa.fuente