How useful is the -[NSObject isMemberOfClass:] method?
cocoa, objective-c
Solution
You generally want `isKindOfClass:`, not `isMemberOfClass:`. The difference is that `isKindOfClass:` will return `YES` if the receiver is a member of a subclass of the class in question, whereas `isMemberOfClass:` will return `NO` in the same case.
As Graham Lee points out, `NSArray` is a class cluster. That means that every `NSArray` instance is actually an instance of some subclass—hence your findings. Only `isKindOfClass:` is useful for class-membership testing with class clusters.
That said, you generally should use `respondsToSelector:` rather than class-membership testing. One example would be `objectEnumerator`, which is also implemented by `NSSet` and `NSDictionary` (both of those also being class clusters). An exception would be plist serialization: sets aren't property lists, so you'd need to send `allObjects` to your set to get an array before trying to make plist data from it.
Problem
Here's a small test program I wrote: ``` #import <Foundation/Foundation.h> int main(int argc, char **argv) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSArray *arr = [NSArray array]; printf("Arr isMemberOfClass NSArray: %d\n", [arr isMemberOfClass:[NSArray class]]); printf("Arr isKindOfClass NSArray: %d\n", [arr isKindOfClass:[NSArray class]]); [pool release]; return 0; } ``` And its output: ``` $ ./ismemberof Arr isMemberOfClass NSArray: 0 Arr isKindOfClass NSArray: 1 ``` How useful is the `-isMemberOfClass:` method in any of the Foundation classes? I understand this might give the desired results for classes which I subclass, but as for Foundation classes -- I find that a result of false for my arr variable is non-intuitive. Is the reason this happens because NSArray is not a concrete class but instead an abstract class, and underneath the hood NSArray is really a concrete instance of NSCFArray?