OC底層05.2:isKindOfClass 與 isMemberOfClass

先來看看一道常見的面試題:

void isKindOfAndisMemeberOf() {
    BOOL b1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];
    BOOL b2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]];
    BOOL b3 = [(id)[Person class] isKindOfClass:[Person class]];
    BOOL b4 = [(id)[Person class] isMemberOfClass:[Person class]];
    
    BOOL b5 = [(id)[NSObject alloc] isKindOfClass:[NSObject class]];
    BOOL b6 = [(id)[NSObject alloc] isMemberOfClass:[NSObject class]];
    BOOL b7 = [(id)[Person alloc] isKindOfClass:[Person class]];
    BOOL b8 = [(id)[Person alloc] isKindOfClass:[Person class]];
    
    NSLog(@"\n%hhd\n%hhd\n%hhd\n%hhd\n%hhd\n%hhd\n%hhd\n%hhd\n",b1,b2,b3,b4,b5,b6,b7,b8);
}

要想知道輸出結(jié)果為什么,必須先知道isKindOfClass與isMemberOfClass的具體實現(xiàn)。

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

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

+ (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;
}

解析

  1. + (BOOL)isKindOfClass:(Class)cls實現(xiàn)判斷元類是不是為當(dāng)前類,再判斷元類的父類是不是當(dāng)前類,依次判斷下去。所以:
  • NSObject的元類為根元類不同于NSObject,根元類的父類為NSObjectNSObject相同,所以b1true。
  • Person的元類為Person(元類)不同,Person(元類)的父類為根元類不同,根元類的父類為NSObject不同,NSObject父類為nil不同,所以b3false
  1. + (BOOL)isMemberOfClass:(Class)cls是去和元類做比較,元類不同,所以b2b4false。

3.- (BOOL)isKindOfClass:(Class)cls- (BOOL)isMemberOfClass:(Class)cls,都是判斷實例對象的類是不是對應(yīng)的類,區(qū)別在于isKindOf會往父類找,所以b5b8都為true。

運行結(jié)果如圖

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容