isMemberOfClass和isKindOfClass區(qū)別


源碼實(shí)現(xiàn)

減號(hào)開(kāi)頭的方法
//判斷類對(duì)象是否是傳進(jìn)來(lái)的類對(duì)象
- (BOOL)isMemberOfClass:(Class)cls {
    return [self class] == cls;
}
//判斷類對(duì)象是否是傳進(jìn)來(lái)的類對(duì)象類型或者類對(duì)象的子類
- (BOOL)isKindOfClass:(Class)cls {
    for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
        if (tcls == cls) return YES;
    }
    return NO;
}

加號(hào)開(kāi)頭的方法
//判斷類對(duì)象的元類是否是傳進(jìn)來(lái)的類對(duì)象
+ (BOOL)isMemberOfClass:(Class)cls {
    return object_getClass((id)self) == cls;
}

//判斷類對(duì)象的元類 或者類對(duì)象的父類的元類 是否是傳進(jìn)來(lái)的類對(duì)象
+ (BOOL)isKindOfClass:(Class)cls {
    for (Class tcls = object_getClass((id)self); tcls; tcls = tcls->superclass) {
        if (tcls == cls) return YES;
    }
    return NO;
}

// 這句代碼的方法調(diào)用者不管是哪個(gè)類(只要是NSObject體系下的),都返回YES
//子類的元類對(duì)象通過(guò)superClass可以拿到父類的元類對(duì)象  一層層往上拿可以拿到基類的元類對(duì)象  基類的元類對(duì)象superClass指向基類的類對(duì)象
NSLog(@"%d", [NSObject isKindOfClass:[NSObject class]]); // 1
NSLog(@"%d", [NSObject isMemberOfClass:[NSObject class]]); // 0

//[類對(duì)象 isKindOfClass:];左邊類對(duì)象的元類是否是右邊類
NSLog(@"%d", [Person isKindOfClass:[Person class]]); // 0
//[類對(duì)象 isKindOfClass:];左邊類對(duì)象的元類是否是右邊類 或者右邊類的父類
NSLog(@"%d", [Person isMemberOfClass:[Person class]]); // 0
NSLog(@"%d", [Person isMemberOfClass:object_getClass([MJPerson class])]); // 1


id person = [[Person alloc] init];
NSLog(@"%d", [person isMemberOfClass:[Person class]]); 
NSLog(@"%d", [person isMemberOfClass:[NSObject class]]);

NSLog(@"%d", [person isKindOfClass:[Person class]]);
NSLog(@"%d", [person isKindOfClass:[NSObject class]]);

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

相關(guān)閱讀更多精彩內(nèi)容

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