Quelle est la différence entre les fonctions isKindOfClass:(Class)aClass
et isMemberOfClass:(Class)aClass
? Je sais que c'est quelque chose de petit comme, l'un est global alors que l'autre est une correspondance exacte de classe mais j'ai besoin de quelqu'un pour spécifier lequel est qui s'il vous plaît.
Dans Swift isKind(of aClass: AnyClass)
et isMember(of aClass: AnyClass)
.
isKindOfClass:
retourne YES
si le destinataire est une instance de la classe spécifiée ou une instance de toute classe qui hérite de la classe spécifiée.
isMemberOfClass:
retourne YES
si, et seulement si, le destinataire est une instance de la classe spécifiée.
La plupart du temps, vous voulez utiliser isKindOfClass:
pour vous assurer que votre code fonctionne également avec des sous-classes.
Le référence de protocole NSObject parle un peu plus de ces méthodes.
isKindOfClass:
indique si un objet hérite d'une classe donnéeisMemberOfClass:
indique si un objet est une instance de une classe donnée.[[NSMutableData data] isKindOfClass:[NSData class]]; // YES
[[NSMutableData data] isMemberOfClass:[NSData class]]; // NO
Supposer
@interface A : NSObject
@end
@interface B : A
@end
...
id b = [[B alloc] init];
puis
[b isKindOfClass:[A class]] == YES;
[b isMemberOfClass:[A class]] == NO;
Fondamentalement, -isMemberOfClass:
est vrai si l'instance est exactement de la classe spécifiée, alors que -isKindOfClass:
est vrai si l'instance est exactement de la classe spécifiée ou si l'un des ancêtres de l'instance appartient à la classe spécifiée.
-isMemberOfClass:
est rarement utilisé.
isKindOfClass: renvoie une valeur booléenne indiquant si le destinataire est une instance d'une classe donnée ou une instance d'une classe qui hérite de cette classe.
isMemberOfClass: renvoie une valeur booléenne indiquant si le destinataire est une instance d'une classe donnée.
isKindOfClass-> return YES lorsque l'objet est une instance de cette classe ou une instance d'une classe héritée de celle-ci.
isMemberOfClass: retourne YES lorsque l'objet est une instance de cette classe mais non dans le cas où: instance d'une classe qui en a été héritée.
exemple est assez bon dans la réponse de jtbandes.
En raison des clusters de classes, isMemberOfClass peut vous donner une réponse à laquelle vous ne pourriez pas vous attendre. Dans de nombreux cas, votre meilleur choix est probablement: (BOOL) conforme au protocole: (SEL) aSelector ou BOOL) conforme au protocole: (Protocole *) aProtocol. C'est-à-dire qu'il est préférable de les tester s'ils peuvent répondre à vos besoins plutôt que de tester la classe/sous-classe.
Voir Apple doc pour la classe et le protocole NSObject:
--- (http://developer.Apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//Apple_ref/occ/cl/NSObject