Como testar qual classe um objeto está no Objective-C?

207

Como testar se um objeto é uma instância de uma classe específica no Objective-C? Digamos que eu queira ver se o objeto a é uma instância da classe b ou classe c, como faço para fazê-lo?

futureelite7
fonte

Respostas:

345

Para testar se o objeto é uma instância da classe a:

[yourObject isKindOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of 
// given class or an instance of any class that inherits from that class.

ou

[yourObject isMemberOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of a 
// given class.

Para obter o nome da classe do objeto, você pode usar a NSStringFromClassfunção:

NSString *className = NSStringFromClass([yourObject class]);

ou função c da API de tempo de execução da objetiva-c:

#import <objc/runtime.h>

/* ... */

const char* className = class_getName([yourObject class]);
NSLog(@"yourObject is a: %s", className);

EDIT: In Swift

if touch.view is UIPickerView {
    // touch.view is of type UIPickerView
}
Vladimir
fonte
69
não se esqueça de #import <objc / runtime.h> para class_getName ()
Ovesh
6
Há também um método de classe para isso.
Alexander Wallin
3
Meu entendimento é que isso só funciona para objetos que herdam NSObject.
Henrik P. Hessel
1
@afEkenholm - mas não no iOS 4.x, só assim sabemos.
JJ Rohrer
2
Qual é a vantagem de usar class_getNamemais NSStringFromClass? Se não houver, essa resposta deve ser ajustada.
precisa saber é o seguinte
21

Você também pode usar

NSString *className = [[myObject class] description]; 

em qualquer NSObject

Clement M
fonte
8
Isso pode ou não funcionar com base no fato de o programador ter substituído o método de descrição. Porém, o uso de [classe de objeto] ou NSStringFromClass sempre retorna o nome da classe.
precisa saber é o seguinte
1
Bom para depurar e saber que tipo de objeto misterioso é!
M Jesse
3

O que significa isKindOfClass na documentação da Apple

Tenha cuidado ao usar esse método em objetos representados por um cluster de classes. Devido à natureza dos clusters de classe, o objeto que você recebe nem sempre pode ser o tipo esperado. Se você chamar um método que retorna um cluster de classes, o tipo exato retornado pelo método é o melhor indicador do que você pode fazer com esse objeto. Por exemplo, se um método retornar um ponteiro para um objeto NSArray, você não deve usar esse método para verificar se a matriz é mutável, conforme mostrado no código a seguir:

// DO NOT DO THIS!
if ([myArray isKindOfClass:[NSMutableArray class]])
{
    // Modify the object
}

Se você usar essas construções em seu código, poderá pensar que é correto modificar um objeto que, na realidade, não deve ser modificado. Isso pode criar problemas para outro código que espera que o objeto permaneça inalterado.

Duque
fonte
Seu código de exemplo não está correto. Você só terá problemas se testar o NSArray, que é imutável de qualquer maneira. Se você deseja testar uma classe específica, use isMemberOfClass.
usar o seguinte código
@ futureelite7 Este é um exemplo de como não testar o tipo de classe. A documentação da Apple afirma que -isKindOfClass:& -isMemberOfClass:não deve ser usado para identificar objetos em um cluster de classes.
Pxpgraphics
3

Se você deseja procurar uma classe específica, pode usar

if([MyClass class] == [myClassObj class]) {
//your object is instance of MyClass
}
Inder Kumar Rathore
fonte
1

se você deseja obter o nome da classe, basta ligar para: -

id yourObject= [AnotherClass returningObject];

NSString *className=[yourObject className];

NSLog(@"Class name is : %@",className);
tryKuldeepTanwar
fonte
0

Você também pode verificar o tempo de execução. Coloque um ponto de interrupção no código e dentro da gravação do console (lldb)

(lldb) po [yourObject class]

Como isso..

insira a descrição da imagem aqui

Saranjith
fonte