对象、类对象、元类关系图:

// DZPerson继承自NSObject
@interface DZPerson : NSObject
@end
#import
#import "DZPerson.h"
#import
int main(int argc, const char * argv[]) {
@autoreleasepool {
BOOL re1 = [(id)[NSObject class] isKindOfClass:[NSObject class]]; // 1 在[NSObject class]【元类的继承链】上是否能找到 [NSObject class] ---> YES
BOOL re2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]]; // 0 NSObject元类 是否等于 NSObject类 ---> NO
BOOL re3 = [(id)[DZPerson class] isKindOfClass:[DZPerson class]]; // 0 在[DZPerson class]【元类的继承链】上是否能找到 [DZPerson class] ---> NO
BOOL re4 = [(id)[DZPerson class] isMemberOfClass:[DZPerson class]]; // 0 DZPerson元类 是否等于 DZPerson类 ---> NO
NSLog(@"\n re1:%hhd re2:%hhd re3:%hhd re4:%hhd",re1,re2,re3,re4);
BOOL re5 = [(id)[NSObject alloc] isKindOfClass:[NSObject class]]; // 1 在[NSObject alloc]所属【类的继承链】上是否能找到 [NSObject class] ---> YES
BOOL re6 = [(id)[NSObject alloc] isMemberOfClass:[NSObject class]]; // 1 当前[NSObject alloc]所属类是否等于传入的 [NSObject class] ---> YES
BOOL re7 = [(id)[DZPerson alloc] isKindOfClass:[DZPerson class]]; // 1 在[DZPerson alloc]所属【类的继承链】上是否能找到 [DZPerson class] ---> YES
BOOL re8 = [(id)[DZPerson alloc] isMemberOfClass:[DZPerson class]]; // 1 当前[DZPerson alloc]所属类是否等于传入的 [NSObject class] ---> YES
NSLog(@"\n re5:%hhd re6:%hhd re7:%hhd re8:%hhd",re5,re6,re7,re8);
}
return 0;
}
上述代码其实调用了四个方法:
+ (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = object_getClass((id)self); tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
Class object_getClass(id obj)
{
if (obj) return obj->getIsa();
else return Nil;
}
Class tcls = object_getClass((id)self);
从源码可以看到,self 是类本身,object_getClass((id)self) 则是获取 isa,而 isa 是指向元类的,所以 tcls 实际上是当前类的元类。
for (Class tcls = object_getClass((id)self); tcls; tcls = tcls->superclass)

+ (BOOL)isMemberOfClass:(Class)cls {
return object_getClass((id)self) == cls;
}
- (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
我们可以看到,对象方法的 for循环 初始值 变成了 [self class],也就是从当前类开始找superclass继承链。
所以 [(id)[NSObject alloc] isKindOfClass:[NSObject class]] 和 [(id)[DZPerson alloc] isKindOfClass:[DZPerson class]] 都为 YES。
- (BOOL)isMemberOfClass:(Class)cls {
return [self class] == cls;
}