通過runtime源碼分析
代碼塊
+ (Class)class {
return self;
}
- (Class)class {
return object_getClass(self);
}
+ (Class)superclass {
return self->superclass;
}
- (Class)superclass {
return [self class]->superclass;
}
+ (BOOL)isMemberOfClass:(Class)cls {
return self->ISA() == cls;
}
- (BOOL)isMemberOfClass:(Class)cls {
return [self class] == cls;
}
+ (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;
}
BOOL result1 = [[NSObject class] isKindOfClass:[NSObject class]];
BOOL result2 = [[NSObject class] isMemberOfClass:[NSObject class]];
BOOL result3 = [[Person class] isKindOfClass:[Person class]];
BOOL result4 = [[Person class] isMemberOfClass:[Person class]];
BOOL result5 = [[Person class] isKindOfClass:[NSObject class]];
NSLog(@"%d-%d-%d-%d-%d",result1,result2,result3,result4,result5);
輸出結(jié)果:2021-11-07 11:52:01.460879+0800 TestClass[1483:52222] 1-0-0-0-1
91635690535_.pic_hd.jpg
通過源碼分析得出:
iskindOfClass類方法:當(dāng)前類是否與元類或者元類的父類是否相等(只要有相等的就返回导坟,有一個(gè)遞歸的過程)桐罕。
iskindOfClass實(shí)例方法:當(dāng)前類(或者實(shí)例)是否與當(dāng)前類,元類或者元類的父類是否相等(只要有相等的就返回栋操,有一個(gè)遞歸的過程)。
isMemeberOfClass類方法:當(dāng)前類的元類與當(dāng)前類是否相等
isMemeberOfClass實(shí)例方法:當(dāng)前類與類的比較。