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 
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容