isMemberOfClass & isKindOfClass

2021-11-25  本文已影响0人  读书有毒不中毒

//1.首先申明 四个类 A>B>C>D ,继承关系 A继承B,B继承C,C继承D。即D是最顶层的父类,A是最基层的子类。
A *a = [[A alloc]init];

2.isKindOfClass(对象方法)

[a isKindOfClass [A Class]] //return YES
[a isKindOfClass [B Class]] //return YES
[a isKindOfClass [C Class]] //return YES
[a isKindOfClass [D Class]] //return YES

3.isMemberOfClass(对象方法)
[a isMemberOfClass [A Class]] //return YES
[a isMemberOfClass [B Class]] //return NO
[a isMemberOfClass [C Class]] //return NO
[a isMemberOfClass [D Class]] //return NO

4.isSubclassOfClass(类方法)
[A isSubclassOfClass [A Class]] //return YES
[A isSubclassOfClass [B Class]] //return YES
[A isSubclassOfClass [C Class]] //return YES
[A isSubclassOfClass [D Class]] //return YES

底层实现方法

- (Class)superClass
{
    return [self class] -> superclass;
}
- (BOOL)isMemberOfClass:(Class)cls {
    return [self class] == cls;
}
- (BOOL)isKindOfClass:(Class)cls {
    for (Class tcls = [self class]; tcls; tcls = tcls->superClass) {
        if (tcls == cls) return YES;
    }
    return NO;
}
+ (BOOL)isMemberOfClass:(Class)cls {
    return object_getClass((id)self) == cls;
}
+ (BOOL)isKindOfClass:(Class)cls {
    for (Class tcls = object_getClass((id)self); tcls; tcls = tcls->superclass) {
        if (tcls == cls) return YES;
    }
    return NO;
}
image.png

5.总结
综上看来,isSubclassOfClass和isKindOfClass的作用基本上是一致的,只不过一个是类方法,一个是对象方法。
isMemberOfClass 筛选条件更为苛刻,只有当类型完全匹配的时候才会返回YES。

上一篇下一篇

猜你喜欢

热点阅读