-
先回顾一下isa的走位图
isa流程图.png
分析 re1-re4的代码
BOOL re1 = [(id)[NSObject class] isKindOfClass:[NSObject class]]; //1
BOOL re2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]]; //0
BOOL re3 = [(id)[XpPerson class] isKindOfClass:[LGPerson class]]; //0
BOOL re4 = [(id)[XpPerson class] isMemberOfClass:[XpPerson class]]; //0
可以看得出isKindOfClass和isMemberOfClass的底层实现是
+ (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = self->ISA(); tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
+ (BOOL)isMemberOfClass:(Class)cls {
return self->ISA() == cls;
}
- re1 传进去的cls 是NSObject,Class tcls = self->ISA(),意思是tcls 等于self只向的isa类,根据对象isa走向图,可以知道NSObject指向的是元类(NSObject)->跟元类(NSObject),所以tcls = NSObject
tcls = tcls->superclass,NSObject的superclass还是NSObject,所以cls=tcls 返回1 - re3 传进去cls是XpPerson,上面说了tcls = NSObject,现在cls=XpPerson,所以不等 返回0
- re2 类的元类 ==类?元类(元类NSObject) ==类(NSObject) ?显然不等 返回0
- re4 类的元类 ==类?元类(元类NSObject) ==类(XpPerson) ?显然不等 返回0
再分析 re5-re8的代码
BOOL re5 = [(id)[NSObject alloc] isKindOfClass:[NSObject class]]; //1
BOOL re6 = [(id)[NSObject alloc] isMemberOfClass:[NSObject class]]; //1
BOOL re7 = [(id)[XpPerson alloc] isKindOfClass:[XpPerson class]]; //1
BOOL re8 = [(id)[XpPerson alloc] isMemberOfClass:[XpPerson class]];
上面isKindOfClass和isMemberOfClass底层代码是
- (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
- (BOOL)isMemberOfClass:(Class)cls {
return [self class] == cls;
}
- re5 传进去的cls 是NSObject,Class tcls = [self class];意思是tcls 等于self的类,tcls = NSObject
tcls = tcls->superclass,NSObject的superclass还是自己,所以cls=tcls 返回1 - re7 传进去cls是XpPerson,上面说了tcls = XpPerson,现在cls=XpPerson,所以不等 返回1
- re2[self class] =NSObject ,cls = NSObject 返回1
- re4 [self class] =XpPerson ,cls = XpPerson 返回1