2010-09-06 10 views

Respuesta

238

isKindOfClass: devuelve SÍ si el receptor es una instancia de la clase especificada o una instancia de cualquier clase que hereda de la clase especificada.

isMemberOfClass: devuelve SÍ si el receptor es una instancia de la clase especificada.

La mayor parte del tiempo desea utilizar isKindOfClass: para asegurarse de que su código también funciona con subclases.

El NSObject Protocol Reference habla un poco más sobre estos métodos.

+0

¿Puede por favor aclarar mi duda más adelante? if ([lbl.textColor isMemberOfClass: [UIColor class]]) {// No Memeber NSLog (@ "Not Memeber"); } else { NSLog (@ "Not Memeber"); } if ([imgView.image isMemberOfClass: [UIImage class]]) {// Memeber NSLog (@ "Memeber"); } else { NSLog (@ "Not Memeber"); } – Nikkie

44

Supongamos

@interface A : NSObject 
@end 

@interface B : A 
@end 

... 

id b = [[B alloc] init]; 

continuación

[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: casi nunca se utiliza.

+1

Pero si tiene una matriz de subvistas que incluyen UIViews y un UISegmentedControl y las enlazó y estableció un condicional en la clase, necesitaría usar isMemberOfClas UIView y isMemberOfClass UISegmentedControl para distinguir entre ellas, ¿no? isKindOfClass vería UISegmentedControl como UIView. – PruitIgoe

+0

@Pruitlgoe eso es muy cierto. Puedes usar isKindOfClass: [UIView class] para asegurarte de que todos los objetos con los que tratas son UIView pero necesitarías usar isMemberOfClass: [UIView class] y/o isMemberOfClass: [UISegmentedControl class] dentro de alguna instrucción condicional para indicar cualquier implementación distinta de las vistas basadas en su clase de instancia inmediata –

73
  • 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 
+0

@Durga, si esto responde su pregunta, debe aceptarlo. Lea más acerca de cómo aceptar la tasa aquí: http://meta.stackexchange.com/questions/16721/how-does-accept-rate-work – poncha

9

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

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

3

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

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

ejemplo es suficiente en la respuesta jtbandes.

0

Debido a los clusters 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 probar estos si pueden responder a su necesidad en lugar de probar clase/subclase.

véase el documento de manzana para la clase NSObject y protocolo:

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

Cuestiones relacionadas