美文网首页
iOS isKindOfClass& isMemberOfCla

iOS isKindOfClass& isMemberOfCla

作者: jokerlee | 来源:发表于2020-09-23 18:23 被阅读0次

    首先看一段代码

    BOOL re1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];       //
    BOOL re2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]];     //
    BOOL re3 = [(id)[LGPerson class] isKindOfClass:[LGPerson class]];       //
    BOOL re4 = [(id)[LGPerson class] isMemberOfClass:[LGPerson class]];     //
    NSLog(@" re1 :%hhd\n re2 :%hhd\n re3 :%hhd\n re4 :%hhd\n",re1,re2,re3,re4);
    
    BOOL re5 = [(id)[NSObject alloc] isKindOfClass:[NSObject class]];       //
    BOOL re6 = [(id)[NSObject alloc] isMemberOfClass:[NSObject class]];     //
    BOOL re7 = [(id)[LGPerson alloc] isKindOfClass:[LGPerson class]];       //
    BOOL re8 = [(id)[LGPerson alloc] isMemberOfClass:[LGPerson class]];     //
    NSLog(@" re5 :%hhd\n re6 :%hhd\n re7 :%hhd\n re8 :%hhd\n",re5,re6,re7,re8);
    

    来我们看下输出结果


    image.png

    原理分析

    看下isKindOfClass的类方法&实例方法实现

    + (BOOL)isKindOfClass:(Class)cls {
        for (Class tcls = self->ISA(); 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;
    }
    

    isMemberOfClass的类方法&实例方法实现

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

    然后我们再看一张非常漂亮的isa走位图

    isa流程图.png

    从图中看出一下几点

    • 跟元类的isa指向了自己
    • NSObjectsuperclass为空 (循环出口)
    • 跟元类的superclass指向了NSObject

    结果分析

    • result1 :1 NSObjectNSObject类方法对比
      1.NSObjectNSObject的元类即跟元类 不相等
      2.NSObject 与 根元类的父类即根类 相等,返回1

    • result2 :0 NSObjectNSObject类方法对比

      1. NSObjectNSObject的元类即根元类 不相等
    • result3 :0 LGPersonLGPerson类方法对比
      1.LGPersonLGPerson的元类即元类LGPerson 不相等
      2.LGPerson 与 元类LGPerson的父类即根元类 不相等
      3.LGPerson根元类的父类即根类 不相等
      4.LGPerson根类的父类即 nil 不相等

    • result4 :0 LGPersonLGPerson类方法对比
      1.LGPerson元类 不相等

    • result5 :1 NSObjectNSObject实例方法对比
      1.NSObject 与 对象的isaNSObject根类 相等

    • result6 :1 NSObjectNSObject类方法对比
      1.NSObject 与 对象的类即NSObject根类 相等

    • result7 :1 LGPersonLGPerson类方法对比
      1.LGPerson 与 对象的isaLGPerson 相等

    • result8 :1 LGPersonLGPerson类方法对比
      1.LGPerson 与 对象的类即LGPerson 相等

    相关文章

      网友评论

          本文标题:iOS isKindOfClass& isMemberOfCla

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