Em Objective-C, como posso dizer a diferença entre uma classe e uma instância de uma classe?

votos
3

Vamos dizer que eu tenho um ponteiro genérico em Objective-C. Este ponteiro pode ser um Classobjecto, ou poderia ser um exemplo dessa classe. Existe alguma maneira de dizer a diferença entre os dois?

Exemplo:


id pointerA = [someClass class];
id pointerB = [[someClass alloc] init];

bool pointerAIsAClass = is_this_a_Class(pointerA); // should be true
bool pointerBIsAClass = is_this_a_Class(pointerB); // should be false

Como eu iria escrever a is_this_a_Classfunção para que ele retorne ao bom boolvalor?

bool is_this_a_Class(id somePointer)
{
    // your code goes here
}
Publicado 10/12/2008 em 08:10
fonte usuário
Em outras línguas...                            


2 respostas

votos
4

Eu não vejo uma maneira melhor, e isso não é infalível, mas isso deve funcionar:

BOOL pointer_isClass(id object) {
    return [object respondsToSelector:@selector(instancesRespondToSelector:)];
}

Uma vez que, teoricamente, apenas Classobjetos iria responder à -instancesRespondToSelector:mensagem isso deve funcionar. Do lado de fora de um real objc_*chamada embora eu não vejo qualquer API real para isso.

UPDATE:
Depois de ler a resposta de Giao outro pensamento veio a mim, testar a resposta do ponteiro para o -classmétodo. Chamar -classem um objeto de classe deve ser equivalente à chamada -selfem uma instância objeto, mas voltaria outro objeto em uma instância objeto.

BOOL pointer_isClass(id object) {
    return object == [object class];
}

Eu acho que isso deve ser mais infalível, especialmente no caso em que uma instância de objeto implementa -instancesRespondToSelector:este deve funcionar 100% do tempo.

Respondeu 10/12/2008 em 08:40
fonte usuário

votos
3

A maneira mais correta é verificar a classe do objeto, e ver se é uma metaclasse:

BOOL object_isClass(id object) {
    return class_isMetaClass(object_getClass(object));
}

Há mais respostas aqui: Verifique se o objeto é do tipo Classe

Respondeu 22/07/2011 em 23:53
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more