isMemberOfClass与isKindOfClass的区别

isMemberOfClass与isKindOfClass的区别

#pragma 一.实例对象调用-isMemberOfClass
        //实例对象调用对象方法:-isMemberOfClass
        //方法内部获取当前实例对象的类对象与后面的类对象比较//
        NSLog(@"%d",[[[Person alloc] init] isMemberOfClass:[Person class]]);//YES
        
        //对象方法isMemberOfClass内部 类对象与类对象比较;Person的类对象与NSObject的类对象的不相等;
        NSLog(@"%d",[[[Person alloc] init] isMemberOfClass:[NSObject class]]);//NO
        
#pragma  二.类对象调用+isMemberOfClass
        //isMemberOfClass方法内部,当前类(Person)的元类对象与Person的类对象进行比较
        NSLog(@"%d",[Person isMemberOfClass:[Person class]]);//NO
        //object_getClass([Person class])为获取Person的元类对象
        //Person调用的是类方法+isMemberOfClass,内部会获取Person的元类,与后面进行比较,刚好匹配
        NSLog(@"%d",[Person isMemberOfClass:object_getClass([Person class])]);//YES
    
        
#pragma  三.实例对象调用-isKindOfClass
        //isKindOfClass内部,获取当前类(Person)的实例对象的类对象进行及其父类的类对象与NSObject的类对象进行比较
        NSLog(@"%d",[[Person new] isKindOfClass:[NSObject class]]);//YES
        //isKindOfClass内部,Person类对象与Person的类对象比较,更好匹配
        NSLog(@"%d",[[Person new] isKindOfClass:[Person class]]);//YES
        
#pragma  四.实例对象调用-isKindOfClass
        //Person调用类方法:+isKindOfClass
        //isKindOfClass内部,Person的元类与[NSObject class]类对象进行比较
        //如果Person的元类对象与后面不匹配,则会向上查找父类元类,继续比较,
        //如果,一直循环到最顶部,则NSObject的元类的supperClass指针,会指向NSObject的类对象,则与后边的[NSObject class]类对象刚好匹配
        NSLog(@"%d",[Person isKindOfClass:[NSObject class]]);//YES
        //Person调用类方法+isKindOfClass,方法内部获取Person的元类对象
        //object_getClass(Person)是获取Person元类对象
        //[Person class]是获取Person的类对象,
        //Person的元类对象及其父类的元类对象及其NSObject的类对象与Person的类对象比较,都是不相等的
        NSLog(@"%d",[Person isKindOfClass:[Person class]]);//NO