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


¿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 lo hago?

 204
Author: Mark Amery, 2010-01-13

6 answers

Para probar si el objeto es una instancia de 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 la clase del objeto puede usar la función NSStringFromClass:

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

O c-function de objective-c runtime api:

#import <objc/runtime.h>

/* ... */

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

EDITAR: {[16] } En Swift

if touch.view is UIPickerView {
    // touch.view is of type UIPickerView
}
 340
Author: Vladimir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-08 09:02:01

También puedes usar

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

En cualquier NSObject

 20
Author: Clement M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-07 14:47:54

Lo que significa acerca de isKindOfClass en la Documentación de Apple

Tenga cuidado al usar este método en objetos representados por un clúster de clases. Debido a la naturaleza de los clústeres de clases, el objeto que obtiene puede no ser siempre el tipo que esperaba. Si llama a un método que devuelve un clúster de clases, el tipo exacto devuelto por 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 utilizas estas construcciones en tu código, podrías pensar que está bien modificar un objeto que en realidad no debería ser modificado. Hacerlo podría crear problemas para otro código que esperaba que el objeto permaneciera sin cambios.

 3
Author: Duke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-23 02:37:07

Si desea verificar una clase específica, puede usar

if([MyClass class] == [myClassObj class]) {
//your object is instance of MyClass
}
 3
Author: Inder Kumar Rathore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-22 11:33:00

Si desea obtener el nombre de la clase simplemente llame: -

id yourObject= [AnotherClass returningObject];

NSString *className=[yourObject className];

NSLog(@"Class name is : %@",className);
 1
Author: dreamBegin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-06 10:53:59

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

(lldb) po [yourObject class]

Así..

introduzca la descripción de la imagen aquí

 0
Author: Saranjith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-06 04:01:29