isKindOfClass和isMemberOfClass的区别

turboksiOS241

+ (BOOL)isMemberOfClass:(Class)cls {

//    类的元类 与 传入类 对比

    return object_getClass((id)self) == cls;

}


- (BOOL)isMemberOfClass:(Class)cls {

//    对象的类 与 传入类 对比

    return [self class] == cls;

}


+ (BOOL)isKindOfClass:(Class)cls {

//    元类 --> 根元类 --> 根类 --> nil 与 传入类的对比

    for (Class tcls = object_getClass((id)self); tcls; tcls = tcls->superclass) {

        if (tcls == cls) return YES;

    }

    return NO;

}


- (BOOL)isKindOfClass:(Class)cls {

//    对象的类 --> 父类 --> 根类 --> nil 与 传入类的对比

    for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {

        if (tcls == cls) return YES;

    }

    return NO;

}

测试代码:

        BOOL re1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];

        BOOL re3 = [(id)[KSPerson class] isKindOfClass:[KSPerson class]];

        BOOL re2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]];

        BOOL re4 = [(id)[KSPerson class] isMemberOfClass:[KSPerson class]];

        NSLog(@" \n re1 :%hhd\n re2 :%hhd\n re3 :%hhd\n re4 :%hhd\n",re1,re2,re3,re4);

        

        BOOL re5 = [(id)[NSObject alloc] isKindOfClass:[NSObject class]];

        BOOL re7 = [(id)[KSPerson alloc] isKindOfClass:[KSPerson class]];

        BOOL re6 = [(id)[NSObject alloc] isMemberOfClass:[NSObject class]];

        BOOL re8 = [(id)[KSPerson alloc] isMemberOfClass:[KSPerson class]];

        NSLog(@" \n re5 :%hhd\n re6 :%hhd\n re7 :%hhd\n re8 :%hhd\n",re5,re6,re7,re8);

结果:

2021-01-23 17:25:30.138090+0800 test[8101:257311]  

 re1 :1

 re2 :0

 re3 :0

 re4 :0

2021-01-23 17:25:30.138761+0800 test[8101:257311]  

 re5 :1

 re6 :1

 re7 :1

 re8 :1

Program ended with exit code: 0

相关文章

iOS一行代码搞定自定义AlertView

iOS一行代码搞定自定义AlertView

效果图走一走:使用方式: pod  'KSAlertView'举例使用,单按钮Alert: [[[KSAlertView alloc] initWithT...

iOS多线程

iOS多线程

多线程常见方案一、GCD的函数:GCD中有2个用来执行任务的函数queue:队列block:任务1.    用同步的方式执行任务dispatch_sync(di...

Runtime动态创建类

Runtime动态创建类

- (void)viewDidLoad {    [super viewDidLoad];    Class KSObj = objc_allocateClas...

暗黑模式适配

暗黑模式适配

先上效果图:正常暗黑一:首先确定自己的主题色比如正常模式下显示紫色、暗黑显示下显示灰色。二:在Assets中新建颜色:创建颜色进行设置:设置颜色左边是正常模式的颜色、右边是暗黑模式下三:举例使用&nb...

iOS的block

iOS的block

一:block的本质1.    block本质上是一个OC对象,它内部有个isa指针2.    block是封装了函数调用以及函数调用环境的OC对象3.&nbs...

多线程举例

多线程举例

举例一:- (void)viewDidLoad {    [super viewDidLoad];    dispatch_queue_t queue = di...