iOS difference between isKindOfClass and isMemberOfClass

后端 未结 6 717
礼貌的吻别
礼貌的吻别 2020-11-28 01:37

What is the difference between the isKindOfClass:(Class)aClass and the isMemberOfClass:(Class)aClass functions? I know it is something small like,

相关标签:
6条回答
  • 2020-11-28 01:57

    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.

    0 讨论(0)
  • 2020-11-28 02:08

    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.

    0 讨论(0)
  • 2020-11-28 02:09

    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.

    0 讨论(0)
  • 2020-11-28 02:13

    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.

    0 讨论(0)
  • 2020-11-28 02:15

    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

    0 讨论(0)
  • 2020-11-28 02:23
    • 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
    
    0 讨论(0)
提交回复
热议问题