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