美文网首页
isMemberOfClass和isKindOfClass区别

isMemberOfClass和isKindOfClass区别

作者: OCSwift | 来源:发表于2020-03-24 14:38 被阅读0次
    
    

    源码实现

    减号开头的方法
    //判断类对象是否是传进来的类对象
    - (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区别

          本文链接:https://www.haomeiwen.com/subject/vacoyhtx.html