首先看一段代码
BOOL re1 = [(id)[NSObject class] isKindOfClass:[NSObject class]]; //
BOOL re2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]]; //
BOOL re3 = [(id)[LGPerson class] isKindOfClass:[LGPerson class]]; //
BOOL re4 = [(id)[LGPerson class] isMemberOfClass:[LGPerson class]]; //
NSLog(@" re1 :%hhd\n re2 :%hhd\n re3 :%hhd\n re4 :%hhd\n",re1,re2,re3,re4);
BOOL re5 = [(id)[NSObject alloc] isKindOfClass:[NSObject class]]; //
BOOL re6 = [(id)[NSObject alloc] isMemberOfClass:[NSObject class]]; //
BOOL re7 = [(id)[LGPerson alloc] isKindOfClass:[LGPerson class]]; //
BOOL re8 = [(id)[LGPerson alloc] isMemberOfClass:[LGPerson class]]; //
NSLog(@" re5 :%hhd\n re6 :%hhd\n re7 :%hhd\n re8 :%hhd\n",re5,re6,re7,re8);
来我们看下输出结果

image.png
原理分析
看下isKindOfClass的类方法&实例方法实现
+ (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = self->ISA(); tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
- (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
isMemberOfClass的类方法&实例方法实现
+ (BOOL)isMemberOfClass:(Class)cls {
return self->ISA() == cls;
}
- (BOOL)isMemberOfClass:(Class)cls {
return [self class] == cls;
}
然后我们再看一张非常漂亮的isa走位图

isa流程图.png
从图中看出一下几点
- 跟元类的
isa指向了自己NSObject的superclass为空 (循环出口)- 跟元类的
superclass指向了NSObject
结果分析
result1 :1
NSObject与NSObject类方法对比
1.NSObject与NSObject的元类即跟元类 不相等
2.NSObject与 根元类的父类即根类相等,返回1-
result2 :0
NSObject与NSObject类方法对比-
NSObject与NSObject的元类即根元类不相等
-
result3 :0
LGPerson与LGPerson类方法对比
1.LGPerson与LGPerson的元类即元类LGPerson不相等
2.LGPerson与 元类LGPerson的父类即根元类不相等
3.LGPerson与根元类的父类即根类不相等
4.LGPerson与根类的父类即nil不相等result4 :0
LGPerson与LGPerson类方法对比
1.LGPerson与元类不相等result5 :1
NSObject与NSObject实例方法对比
1.NSObject与 对象的isa即NSObject根类 相等result6 :1
NSObject与NSObject类方法对比
1.NSObject与 对象的类即NSObject根类 相等result7 :1
LGPerson与LGPerson类方法对比
1.LGPerson与 对象的isa即LGPerson相等result8 :1
LGPerson与LGPerson类方法对比
1.LGPerson与 对象的类即LGPerson相等