isKindOfClass和isMemberOfClass
这张图很仔细的解释 对象,类,元类(MetaClass)之间的关系,先看懂这个图
BOOL res2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]];
BOOL res3 = [(id)[CategoryTest class] isKindOfClass:[CategoryTest class]];
BOOL res4 = [(id)[CategoryTest class] isMemberOfClass:[CategoryTest class]]
CategoryTest *p = [[CategoryTest alloc] init];
BOOL res5 = [p isKindOfClass:[CategoryTest class]];
BOOL res6 = [p isMemberOfClass:[CategoryTest class]];
BOOL res7 = [p isKindOfClass:[NSObject class]];
BOOL res8 = [p isMemberOfClass:[NSObject class]];
NSLog(@"%d %d %d %d %d %d %d %d",res1, res2 ,res3, res4,res5,res6,res7,res8);
输出结果
**2021-08-02 13:51:12.464033+0800 Study-Test[22868:3557949] 1 0 0 0 1 1 1 0**
isKindOfClass和isMemberOfClass的源码实现
+ (BOOL)isMemberOfClass:(Class)cls {
return object_getClass((id)self) == cls;
}
- (BOOL)isMemberOfClass:(Class)cls {
return [self class] == cls;
}
+ (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = object_getClass((id)self); 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;
}