Différence iOS entre isKindOfClass et isMemberOfClass

152

Quelle est la différence entre isKindOfClass:(Class)aClassles isMemberOfClass:(Class)aClassfonctions et les fonctions? Je sais que c'est quelque chose de petit comme, l'un est global tandis que l'autre est une correspondance de classe exacte, mais j'ai besoin de quelqu'un pour spécifier lequel est lequel s'il vous plaît.

Dans Swift isKind(of aClass: AnyClass)et isMember(of aClass: AnyClass).

NoodleOfDeath
la source

Réponses:

264

isKindOfClass:renvoie YESsi le récepteur 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:renvoie YESsi, et seulement si, le récepteur est une instance de la classe spécifiée.

La plupart du temps, vous souhaitez vous isKindOfClass:assurer que votre code fonctionne également avec les sous-classes.

La référence de protocole NSObject parle un peu plus de ces méthodes.

Sébastien Celis
la source
Pouvez-vous s'il vous plaît effacer mon doute ci-dessous? if ([lbl.textColor isMemberOfClass: [UIColor class]]) {// Not Memeber NSLog (@ "Not Memeber"); } else {NSLog (@ "Not Memeber"); } if ([imgView.image isMemberOfClass: [Classe UIImage]]) {// Memeber NSLog (@ "Memeber"); } else {NSLog (@ "Not Memeber"); }
Nikkie
82
  • isKindOfClass:indique si un objet hérite d'une classe donnée
  • isMemberOfClass:indique si un objet est une instance d' une classe donnée.

[[NSMutableData data] isKindOfClass:[NSData class]]; // YES
[[NSMutableData data] isMemberOfClass:[NSData class]]; // NO
jtbandes
la source
@Durga, si cela répond à votre question, vous devez l'accepter. En savoir plus sur l'acceptation du taux ici: meta.stackexchange.com/questions/16721/…
poncha
1
isKindOfClass retournera également YES si l'objet est une instance d'une classe donnée. En d'autres termes, isMemberOfClass est un sous-ensemble de isKindOfClass.
Scooter
48

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 appartient exactement à la classe spécifiée, tandis que -isKindOfClass:est vrai si l'instance appartient exactement à 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é.

KennyTM
la source
1
Mais si vous avez un tableau de sous-vues qui incluent UIViews et un UISegmentedControl et que vous les parcourez en boucle et définissez une condition conditionnelle sur la classe, vous devez utiliser isMemberOfClas UIView et isMemberOfClass UISegmentedControl pour les distinguer, non? isKindOfClass verrait l'UISegmentedControl comme un UIView.
PruitIgoe
@Pruitlgoe c'est très vrai. Vous pouvez utiliser isKindOfClass: [classe UIView] pour vous assurer que tous les objets que vous traitez sont des UIViews mais vous devrez utiliser isMemberOfClass: [classe UIView] et / ou isMemberOfClass: [classe UISegmentedControl] dans une instruction conditionnelle pour indiquer une implémentation distincte des vues basées sur leur classe d'instance immédiate
NoodleOfDeath
9

isKindOfClass : renvoie une valeur booléenne qui indique si le récepteur 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 qui indique si le récepteur est une instance d'une classe donnée.

Alex Terente
la source
2

isKindOfClass-> return YES lorsque l'objet est une instance de cette classe ou une instance d'une classe qui en est héritée.

isMemberOfClass: retourne YES lorsque l'objet est une instance de cette classe mais Non en cas: instance d'une classe qui en est héritée.

exemple est assez bon dans la réponse jtbandes.

Ishu
la source
0

En raison des clusters de classes, isMemberOfClass peut vous donner une réponse à laquelle vous ne vous attendez peut-être pas. Dans de nombreux cas, votre meilleur choix est plus susceptible d'être - (BOOL) conformsToProtocol: (SEL) aSelector ou - (BOOL) conformsToProtocol: (Protocol *) aProtocol. Par exemple, il est préférable de les tester si elles peuvent répondre à vos besoins plutôt que de tester la classe / sous-classe.

Consultez la documentation Apple 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

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intf/NSObject

Art Swri
la source