iOS 进阶笔记(七)7.2 isMemberOfClass和isKindOfClass分析

📣 iOS进阶笔记目录

#pragma mark-  😁😁😁😁😁😁 isMemberOfClass
+ (BOOL)isMemberOfClass:(Class)cls {
    // 判断当前类对象的isa(即元类对象)是否与cls相等,要求cls为元类对象(通过object_getClass(类对象))
    return self->ISA() == cls;
}

- (BOOL)isMemberOfClass:(Class)cls {
    // 判断当instance的类对象是否与cls相等,要求cls为类对象
    return [self class] == cls;
}

#pragma mark- 😁😁😁😁😁😁 isKindOfClass
+ (BOOL)isKindOfClass:(Class)cls {
    // self->ISA()指向方法调用者类对象(如Person对象)的元类对象
    // 1、若当前类对象的元类对象tcls = cls, 返回YES
    // 2、否则,向上查找tcls父类再与cls比较看是否相等,若第一层父类相等则返回YES
    // 3、否则,则继续向上查找,直到找到NSObject元类对象,NSObject元类对象的superClass指向了NSOject类对象本身
    for (Class tcls = self->ISA(); tcls; tcls = tcls->getSuperclass()) {
        if (tcls == cls) return YES;
    }
    return NO;
}

- (BOOL)isKindOfClass:(Class)cls {
    // 1、令当前tcls = 当前实例对象的类对象;
    // 2、当cls等于当前实例对象的类对象时,放回YES
    // 3、否则,判断当前tcls是否等于nil,若为nil,退出循环,并返回NO
    // 4、若tcls不等于nil,则查找tcls的父类对象
    // 5、若tcls的上一层父类对象,tcls_1 == cls,则返回YES,否则,继续查找tcls的父类
    // 6、若cls是继承自NSObject(或cls为NSObject),则一定可以找到类对象tcls_n与cls相等
    for (Class tcls = [self class]; tcls; tcls = tcls->getSuperclass()) {
        if (tcls == cls) return YES;
    }
    return NO;
}
posted @ 2021-08-04 20:58  ITRyan  阅读(71)  评论(0编辑  收藏  举报