iPhone SDK difference between isKindOfClass and isMemberOfClass

6 Solutions Collect From Internet About “iPhone SDK difference between isKindOfClass and isMemberOfClass”

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 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