¿Cómo pruebo en qué clase está un objeto en Objective-C?

207

¿Cómo pruebo si un objeto es una instancia de una clase particular en Objective-C? Digamos que quiero ver si el objeto a es una instancia de clase b, o clase c, ¿cómo hago para hacerlo?

futureelite7
fuente

Respuestas:

345

Para probar si el objeto es una instancia de la clase 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.

o

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

Para obtener el nombre de clase del objeto, puede usar la NSStringFromClassfunción:

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

o función c de la API de tiempo de ejecución del objetivo-c:

#import <objc/runtime.h>

/* ... */

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

EDITAR: en Swift

if touch.view is UIPickerView {
    // touch.view is of type UIPickerView
}
Vladimir
fuente
69
no olvides #importar <objc / runtime.h> para class_getName ()
Ovesh
66
También hay un método de clase para esto.
Alexander Wallin
3
Tengo entendido que esto solo funciona para objetos que heredan NSObject.
Henrik P. Hessel
1
@afEkenholm, pero no en iOS 4.x, para que lo sepamos.
JJ Rohrer
2
¿Cuál es la ventaja de usar class_getNamemás NSStringFromClass? Si no hay ninguno, esta respuesta debe ajustarse.
Dan Rosenstark
21

También puedes usar

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

en cualquier NSObject

Clemente M
fuente
8
Esto puede o no funcionar en función de si el programador ha anulado el método de descripción. Sin embargo, el uso de [clase de objeto] o NSStringFromClass siempre devuelve el nombre de la clase.
futureelite7
1
¡Bueno para depurar y saber de qué tipo es tu objeto misterioso!
M Jesse
3

Lo que significa isKindOfClass en la documentación de Apple

Tenga cuidado al usar este método en objetos representados por un grupo de clases. Debido a la naturaleza de los grupos de clases, el objeto que recupera puede no ser siempre del tipo que esperaba. Si llama a un método que devuelve un grupo de clases, el tipo exacto que devuelve el método es el mejor indicador de lo que puede hacer con ese objeto. Por ejemplo, si un método devuelve un puntero a un objeto NSArray, no debe usar este método para ver si la matriz es mutable, como se muestra en el siguiente código:

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

Si usa tales construcciones en su código, podría pensar que está bien modificar un objeto que en realidad no debería modificarse. Hacerlo podría crear problemas para otro código que espera que el objeto permanezca sin cambios.

Duque
fuente
Su código de ejemplo no es correcto. Solo tendrá problemas si prueba NSArray, que de todos modos es inmutable. Si desea probar una clase específica, debe usar isMemberOfClass en su lugar.
futureelite7
@ futureelite7 Este es un ejemplo de cómo no evaluar el tipo de clase. La documentación de Apple establece que -isKindOfClass:& -isMemberOfClass:no debe usarse para identificar objetos dentro de un grupo de clases.
pxpgraphics
3

Si desea verificar una clase específica, puede usar

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

si desea obtener el nombre de la clase simplemente llame:

id yourObject= [AnotherClass returningObject];

NSString *className=[yourObject className];

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

También puede verificar el tiempo de ejecución. Ponga un punto de interrupción en el código y escriba dentro de la consola (lldb)

(lldb) po [yourObject class]

Me gusta esto..

ingrese la descripción de la imagen aquí

Saranjith
fuente