isMemberOfClass和isKindOfClass区别


源码实现

减号开头的方法
//判断类对象是否是传进来的类对象
- (BOOL)isMemberOfClass:(Class)cls {
    return [self class] == cls;
}
//判断类对象是否是传进来的类对象类型或者类对象的子类
- (BOOL)isKindOfClass:(Class)cls {
    for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
        if (tcls == cls) return YES;
    }
    return NO;
}

加号开头的方法
//判断类对象的元类是否是传进来的类对象
+ (BOOL)isMemberOfClass:(Class)cls {
    return object_getClass((id)self) == cls;
}

//判断类对象的元类 或者类对象的父类的元类 是否是传进来的类对象
+ (BOOL)isKindOfClass:(Class)cls {
    for (Class tcls = object_getClass((id)self); tcls; tcls = tcls->superclass) {
        if (tcls == cls) return YES;
    }
    return NO;
}

// 这句代码的方法调用者不管是哪个类(只要是NSObject体系下的),都返回YES
//子类的元类对象通过superClass可以拿到父类的元类对象  一层层往上拿可以拿到基类的元类对象  基类的元类对象superClass指向基类的类对象
NSLog(@"%d", [NSObject isKindOfClass:[NSObject class]]); // 1
NSLog(@"%d", [NSObject isMemberOfClass:[NSObject class]]); // 0

//[类对象 isKindOfClass:];左边类对象的元类是否是右边类
NSLog(@"%d", [Person isKindOfClass:[Person class]]); // 0
//[类对象 isKindOfClass:];左边类对象的元类是否是右边类 或者右边类的父类
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 

你可能感兴趣的:(isMemberOfClass和isKindOfClass区别)