Comment tester la classe d'un objet dans Objective-C?

207

Comment puis-je tester si un objet est une instance d'une classe particulière dans Objective-C? Disons que je veux voir si l'objet a est une instance de classe b ou de classe c, comment dois-je procéder?

futureelite7
la source

Réponses:

345

Pour tester si l'objet est une instance de 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.

Pour obtenir le nom de classe de l'objet, vous pouvez utiliser la NSStringFromClassfonction:

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

ou c-fonction de l'api d'exécution objective-c:

#import <objc/runtime.h>

/* ... */

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

EDIT: Dans Swift

if touch.view is UIPickerView {
    // touch.view is of type UIPickerView
}
Vladimir
la source
69
n'oubliez pas de #import <objc / runtime.h> pour class_getName ()
Ovesh
6
Il existe également une méthode de classe pour cela.
Alexander Wallin, le
3
Ma compréhension est que cela ne fonctionne que pour les objets qui héritent de NSObject.
Henrik P. Hessel
1
@afEkenholm - mais pas sur iOS 4.x, juste pour que nous le sachions.
JJ Rohrer
2
Quel est l'avantage d'utiliser class_getNameOver NSStringFromClass? S'il n'y en a pas, cette réponse doit être ajustée.
Dan Rosenstark
21

Vous pouvez également utiliser

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

sur n'importe quel NSObject

Clement M
la source
8
Cela peut ou non fonctionner selon que le programmeur a outrepassé la méthode de description. Cependant, l'utilisation de [classe d'objet] ou de NSStringFromClass renvoie toujours le nom de la classe.
futureelite7
1
Bon pour déboguer et savoir de quel type est votre objet mystère!
M Jesse
3

Que signifie isKindOfClass dans la documentation Apple

Soyez prudent lorsque vous utilisez cette méthode sur des objets représentés par un cluster de classes. En raison de la nature des clusters de classes, l'objet que vous récupérez peut ne pas toujours être le type que vous attendiez. Si vous appelez une méthode qui renvoie un cluster de classes, le type exact renvoyé par la méthode est le meilleur indicateur de ce que vous pouvez faire avec cet objet. Par exemple, si une méthode renvoie un pointeur sur un objet NSArray, vous ne devez pas utiliser cette méthode pour voir si le tableau est modifiable, comme indiqué dans le code suivant:

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

Si vous utilisez de telles constructions dans votre code, vous pourriez penser qu'il est correct de modifier un objet qui en réalité ne devrait pas être modifié. Cela pourrait alors créer des problèmes pour d'autres codes qui s'attendaient à ce que l'objet reste inchangé.

Duc
la source
Votre exemple de code n'est pas correct. Vous ne rencontrerez des problèmes que si vous testez NSArray, qui est de toute façon immuable. Si vous souhaitez tester une classe spécifique, vous devez utiliser isMemberOfClass à la place.
futureelite7
@ futureelite7 Voici un exemple de la façon de ne pas tester le type de classe. La documentation Apple indique que -isKindOfClass:& -isMemberOfClass:ne doit pas être utilisé pour identifier des objets dans un cluster de classes.
pxpgraphics
3

Si vous souhaitez rechercher une classe spécifique, vous pouvez utiliser

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

si vous voulez obtenir le nom de la classe, appelez simplement: -

id yourObject= [AnotherClass returningObject];

NSString *className=[yourObject className];

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

Vous pouvez également vérifier le temps d'exécution. Mettre un point d'arrêt dans le code et écrire dans la console (lldb)

(lldb) po [yourObject class]

Comme ça..

entrez la description de l'image ici

Saranjith
la source