美文网首页
isMemberOfClass & isKindOfClass

isMemberOfClass & isKindOfClass

作者: 读书有毒不中毒 | 来源:发表于2021-11-25 17: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。

    相关文章

      网友评论

          本文标题:isMemberOfClass & isKindOfClass

          本文链接:https://www.haomeiwen.com/subject/escztrtx.html