BOOL res1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];//YES
在runtime源碼中:
+ (BOOL)isKindOfClass:(Class)cls {
? ? for(Class tcls = object_getClass((id)self); tcls; tcls = tcls->superclass) {
? ? ? ? if(tcls == cls)return YES;
? ? }
? ? return NO;
}
調(diào)用類方法:cls為NSObject,而 tcls是第一次先調(diào)用object_getClass((id)self)返回objc_class中shiftcls 的isa指針,它指向元類,繼續(xù)循環(huán)在父類查找...一直到Rootclass的元類它的父類指向Rootclass類(NSObject),而cls為NSObject 所以相等
? ? ? ? BOOL res2 = [(id)[NSObject class]isMemberOfClass:[NSObject class]];
在runtime源碼:
+ (BOOL)isMemberOfClass:(Class)cls {
? ? return object_getClass((id)self) == cls;
}
調(diào)用類方法:object_getClass((id)self)通過 isa_t的isa.bits進(jìn)行位運(yùn)算獲取 isa指針指向元類而cls為NSObject類所以不想等
? ? ? ? //BOOL res3 = [(id)[Sark class] isKindOfClass:[Sark class]];
runtime源碼:
+ (BOOL)isKindOfClass:(Class)cls {
? ? for(Class tcls =object_getClass((id)self); tcls; tcls = tcls->superclass) {
? ? ? ? if(tcls == cls)return YES;
? ? }
? ? return NO;
}
調(diào)用類方法:通過object_getClass((id)self)指向元類與cls不想等,繼續(xù)循環(huán)在父類中...一直走到RootClass元類它的父類指向NSObject截止,而cls為Sark,與NSObject不相等所以返回NO
? ? ? ? //BOOL res4 = [(id)[Sark class] isMemberOfClass:[Sark class]];
runtime源碼:
+ (BOOL)isMemberOfClass:(Class)cls {
? ? return object_getClass((id)self) == cls;
}
調(diào)用類方法:object_getClass((id)self)獲取指向元類,與NSObject不相等返回NO。