web-dev-qa-db-fra.com

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

Comment 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 la classe b ou de la classe c, comment puis-je le faire?

205
futureelite7

Pour tester si objet est une instance de la 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 fonction NSStringFromClass:

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: En rapide

if touch.view is UIPickerView {
    // touch.view is of type UIPickerView
}
342
Vladimir

Vous pouvez aussi utiliser 

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

sur n'importe quel NSObject

20
Clement M

Que signifie à propos de 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 correspondre au type attendu. Si vous appelez une méthode qui retourne 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 retourne un pointeur sur un objet NSArray, vous ne devez pas utiliser cette méthode pour voir si le tableau est mutable, 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 un autre code qui s'attend à ce que l'objet reste inchangé.

3
Duke

Si vous voulez vérifier une classe spécifique, vous pouvez utiliser

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

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

id yourObject= [AnotherClass returningObject];

NSString *className=[yourObject className];

NSLog(@"Class name is : %@",className);
1
dreamBegin

Vous pouvez également vérifier le temps d'exécution. Mettez un point d'arrêt dans le code et à l'intérieur de la console (lldb) write

(lldb) po [yourObject class]

Comme ça..

 enter image description here

0
Saranjith