易混淆的isMemberOfClass和isKindOfClas

2018-06-01  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读