La diferencia de iOS entre isKindOfClass y isMemberOfClass

152

¿Cuál es la diferencia entre isKindOfClass:(Class)aClasslas isMemberOfClass:(Class)aClassfunciones y? Sé que es algo pequeño, uno es global, mientras que el otro es una coincidencia de clase exacta, pero necesito que alguien especifique cuál es cuál, por favor.

En Swift isKind(of aClass: AnyClass)y isMember(of aClass: AnyClass).

NoodleOfDeath
fuente

Respuestas:

264

isKindOfClass:devuelve YESsi el receptor es una instancia de la clase especificada o una instancia de cualquier clase que herede de la clase especificada.

isMemberOfClass:devuelve YESsi, y solo si, el receptor es una instancia de la clase especificada.

La mayoría de las veces desea usar isKindOfClass:para asegurarse de que su código también funcione con subclases.

La referencia de protocolo de NSObject habla un poco más sobre estos métodos.

Sebastian Celis
fuente
¿Puedes aclarar mi duda a continuación? if ([lbl.textColor isMemberOfClass: [clase UIColor]]) {// Not Memeber NSLog (@ "Not Memeber"); } else {NSLog (@ "No es miembro"); } if ([imgView.image isMemberOfClass: [clase UIImage]]) {// Memeber NSLog (@ "Memeber"); } else {NSLog (@ "No es miembro"); }
Nikkie
82
  • isKindOfClass:indica si un objeto hereda de una clase dada
  • isMemberOfClass:indica si un objeto es una instancia de una clase dada.

[[NSMutableData data] isKindOfClass:[NSData class]]; // YES
[[NSMutableData data] isMemberOfClass:[NSData class]]; // NO
jtbandes
fuente
@ Durga, si esto responde a tu pregunta, deberías aceptarla. Lea más sobre la tasa de aceptación aquí: meta.stackexchange.com/questions/16721/…
poncha
1
isKindOfClass también devolverá SÍ si el objeto es una instancia de una clase dada. En otras palabras, isMemberOfClass es un subconjunto de isKindOfClass.
Scooter
48

Suponer

@interface A : NSObject 
@end

@interface B : A
@end

...

id b = [[B alloc] init];

luego

[b isKindOfClass:[A class]] == YES;
[b isMemberOfClass:[A class]] == NO;

Básicamente, -isMemberOfClass:es cierto si la instancia es exactamente de la clase especificada, mientras que -isKindOfClass:es cierto si la instancia es exactamente de la clase especificada o si uno de los antepasados ​​de la instancia es de la clase especificada.

-isMemberOfClass: rara vez se usa.

kennytm
fuente
1
Pero si tiene una variedad de subvistas que incluyen UIViews y un UISegmentedControl y las recorrió y estableció un condicional en la clase, necesitaría usar isMemberOfClas UIView y isMemberOfClass UISegmentedControl para distinguir entre ellas, ¿no? isKindOfClass vería el UISegmentedControl como una UIView.
PruitIgoe
@Pruitlgoe eso es muy cierto. Puede usar isKindOfClass: [clase UIView] para asegurarse de que todos los objetos con los que está tratando son UIViews, pero necesitaría usar isMemberOfClass: [clase UIView] y / o isMemberOfClass: [clase UISegmentedControl] dentro de una declaración condicional para indicar cualquier implementación distinta de las vistas basadas en su clase de instancia inmediata
NoodleOfDeath
9

isKindOfClass : devuelve un valor booleano que indica si el receptor es una instancia de una clase dada o una instancia de cualquier clase que herede de esa clase.

isMemberOfClass : devuelve un valor booleano que indica si el receptor es una instancia de una clase determinada.

Alex Terente
fuente
2

isKindOfClass-> devuelve YES cuando el objeto es instancia de esa clase o instancia de una clase que se hereda de él.

isMemberOfClass: devuelve YES cuando el objeto es una instancia de esa clase pero No en el caso: instancia de una clase que se hereda de ella.

ejemplo es lo suficientemente bueno en la respuesta jtbandes.

Ishu
fuente
0

Debido a los clústeres de clase, isMemberOfClass puede darle una respuesta que podría no esperar. En muchos casos es más probable que su mejor opción sea - (BOOL) conformsToProtocol: (SEL) aSelector o - (BOOL) conformsToProtocol: (Protocol *) aProtocol. Es decir, es mejor probarlos si pueden responder a su necesidad en lugar de probar la clase / subclase.

Vea el documento de Apple para la clase y protocolo 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
fuente