美文网首页
易混淆的isMemberOfClass和isKindOfClas

易混淆的isMemberOfClass和isKindOfClas

作者: 陈_振 | 来源:发表于2018-06-01 22:30 被阅读0次

    看一下这两个方法的实现源码就清楚了:

    + (BOOL)isMemberOfClass:(Class)cls {
        return object_getClass((id)self) == cls;
    }
    
    - (BOOL)isMemberOfClass:(Class)cls {
        return [self class] == cls;
    }
    
    + (BOOL)isKindOfClass:(Class)cls {
        for (Class tcls = object_getClass((id)self); 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;
    }
    

    有下面几点需要注意:

    1. isMemberOfClass:(Class)cls 必须与参数是同一类对象才返回YES。
    2. -开头的方法比较的是类对象;+开头的方法比较的是元类对象(metaClass)。
    3. (CZPerson继承自NSObject)
      [CZPerson isKindOfClass:[CZPerson class]];
      该方法的返回值为NO,原因是传递的参数是类对象不是元类对象。
      然而!!!
      [CZPerson isKindOfClass:[NSObject class]]
      返回值为YES!原因是,当CZPerson的元类对象沿着superClass指针向上找到NSObject元类对象时,因为NSObject元类对象的superClass指针指向NSObject类对象,因此,返回YES。参见下图:
      Screen Shot 2018-06-01 at 22.30.07.png

    相关文章

      网友评论

          本文标题:易混淆的isMemberOfClass和isKindOfClas

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