美文网首页
iOS 关于isKindOfClass和isMemberOfCl

iOS 关于isKindOfClass和isMemberOfCl

作者: 男人宫 | 来源:发表于2022-05-19 16:17 被阅读0次

    这两个方法可能有些人容易记混。特别都存在对象方法和类方法
    其实通过底层源码可知,这两个方法的重点:
    一、清楚isKindOfClass是看消息接收者(当前类)和传入的类是否相等,如果不相等看消息接受者的superClsass和传入的类是否相等。而isMemberOfClass就是比较消息接收者和传入的类是否相等
    二、isa指向。当使用对象方法时,isa指向肯定是类对象,分析类对象即可。当使用类方法时,isa的指向肯定就是元类。比较元类即可

    代码分析:Student继承Person,Person继承NSObject

    ------实例方法------
    Person *p = [Person new];
    Student *s = [Student new];
    //下面输出结果为0,显然s的类对象和Nsobject的类对象不同
    NSLog(@"%d",[s isMemberOfClass:[NSObject class]]);
    //输出结果为1.因为s的类对象和NSObject的类对象不相同,当遍历查找s的SuperClass时,最终查找到根类的类对象,就是NSObject的类对象
    NSLog(@"%d",[s isKindOfClass:[NSObject class]]);
    //同理输出结果为1
    NSLog(@"%d",[p isKindOfClass:[NSObject class]]);
    //..其它可同理去分析
    --------类方法-------
    //输出结果为0,类方法时比较的是元类,看后面传入的类就知道不会相等
     NSLog(@"%d",[Person isKindOfClass:[Person class]]);
    //输出结果为1,Person元类的SuperClass指向Nsobject的元类
    NSLog(@"%d",[Person isKindOfClass:object_getClass([NSObject class])]);
    //输出结果为0
    NSLog(@"%d",[Person isMemberOfClass:object_getClass([NSObject class])]);
    

    相关文章

      网友评论

          本文标题:iOS 关于isKindOfClass和isMemberOfCl

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