isMemberOfClass

判断对象是否是Class的实例,如果是返回YES,如果不是返回NO

我们看看他的底层实现是什么样子的

- (BOOL)isMemberOfClass:(Class)cls {
    return [self class] == cls;
}
+ (BOOL)isMemberOfClass:(Class)cls {
    return self->ISA() == cls;
}

isKindOfClass

- (BOOL)isKindOfClass:(Class)cls {
    for (Class tcls = [self class]; tcls; tcls = tcls->getSuperclass()) {
        if (tcls == cls) return YES;
    }
    return NO;
}
+ (BOOL)isKindOfClass:(Class)cls {
    for (Class tcls = self->ISA(); tcls; tcls = tcls->getSuperclass()) {
        if (tcls == cls) return YES;
    }
    return NO;
}

Class的ISA()方法获取的是元类对象,所以这里比较的元类

代码实测

Untitled

知道了方法的原理后在看这写会非常清晰,这里可能有一点不明白是[[NSObject class] isKindOfClass:[NSObject class]]他为什么是YES,这个在前面我们讲到了metaClass的基类指向了[NSObject Class]

总结