iOS内省函数

290 阅读1分钟

isKindOfClass和isMemberOfClass

这张图很仔细的解释 对象,类,元类(MetaClass)之间的关系,先看懂这个图 WechatIMG343.png

    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;
}