What is the difference between the isKindOfClass:(Class)aClass
and the isMemberOfClass:(Class)aClass
functions?
I know it is something small like, one is global while the other is an exact class match but I need someone to specify which is which please.
In Swift isKind(of aClass: AnyClass)
and isMember(of aClass: AnyClass)
.
isKindOfClass:
returns YES
if the receiver is an instance of the specified class or an instance of any class that inherits from the specified class.
isMemberOfClass:
returns YES
if, and only if, the receiver is an instance of the specified class.
Most of the time you want to use isKindOfClass:
to ensure that your code also works with subclasses.
The NSObject Protocol Reference talks a little more about these methods.
isKindOfClass:
indicates whether an object inherits from a given class
isMemberOfClass:
indicates whether an object is an instance of a given class.
[[NSMutableData data] isKindOfClass:[NSData class]]; // YES
[[NSMutableData data] isMemberOfClass:[NSData class]]; // NO
Suppose
@interface A : NSObject
@end
@interface B : A
@end
...
id b = [[B alloc] init];
then
[b isKindOfClass:[A class]] == YES;
[b isMemberOfClass:[A class]] == NO;
Basically, -isMemberOfClass:
is true if the instance is exactly of the specified class, while -isKindOfClass:
is true if the instance is exactly of the specified class or if one of the instance's ancestors is of the specified class.
-isMemberOfClass:
is seldom used.
isKindOfClass: 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.
isMemberOfClass: Returns a Boolean value that indicates whether the
receiver is an instance of a given class.
isKindOfClass-> return YES when the object is instance of that class or instance of a class which is inherited from it.
isMemberOfClass: return YES when the object is instance of that class but No in case: instance of a class which is inherited from it.
example is good enough in jtbandes answer.
Because of class clusters, isMemberOfClass can give you an answer you might not expect. In many cases your best choice is more likely to be -(BOOL)conformsToProtocol:(SEL)aSelector or - (BOOL)conformsToProtocol:(Protocol*)aProtocol. I.e, it's better to test these if they can answer your need rather than testing class/subclass.
See apple doc for NSObject class and protocol:
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