Estou tentando obter um nome de seqüência de caracteres de uma classe do próprio objeto de classe.
// For instance
[NSArray className]; // @"NSArray"
Descobri, object_getClassName(id obj)
mas isso exige que uma instância seja passada a ela e, no meu caso, é um trabalho desnecessário.
Então, como posso obter uma string de um objeto de classe, e não uma instância?
objective-c
reflection
metaprogramming
objective-c-runtime
Alex Wayne
fonte
fonte
NSStringFromClass
implementado? É mais eficiente armazenar o nome da classe em umastatic NSString
variável?[NSArray class]
) é realmente umstruct
. Ostruct
contém muitas informações sobre a classe, incluindo seu nome, os métodos que implementa, a superclasse etc.NSStringFromClass
apenas extrai o nome da classestruct
e a converte em umNSString
. Não armazene o nome da classe emstatic NSString
, ele não oferecerá nenhuma vantagem de desempenho.NSClassFromString
funciona um pouco diferente. Como todos os nomes de classe existem em algum lugar do tempo de execução Objective-C,NSClassFromString
pega a sequência e explora a lista de classes mantidas pelo tempo de execução procurando pela classe que tem o nome fornecido. Se o encontrar, ele retornará, caso contrário, retornaráNil
.class_getName()
no tempo de execução, que retorna uma string CclassName
é um método adicionado pelas extensões de script que só está disponível no Mac OS X; mesmo assim, é meticuloso na maneira como funciona porque não está totalmente documentado (ou pelo menos não foi a última vez que verifiquei).NSStringFromClass()
é a maneira correta de fazer isso.Aqui está uma maneira diferente de fazer isso com um pouco menos de digitação:
fonte
+description
, no entanto, em teoria, esse não é o objetivo+description
e, portanto, esse método é frágil para determinar os nomes das classes.Considere esta alternativa:
É muito mais rápido, pois não precisa alocar o objeto NSString e converter ASCII para qualquer
NSString
representação. É assim queNSStringFromClass()
é implementado.fonte