isKindOfClass和isMemberOfClass的区别

isKindOfClass的实现代码如下:

-(BOOL)isKindOfClass:(Class)aClass

{

            for (Class tcls = isa; tcls; tcls-> superclass) {

                     if (tcls == aClass) {

                             return YES;

                     }

            }

        return NO;

}

isMemberOfClass的实现代码如下:

-(BOOL)isMemberOfClass:(Class)aClass

{

          return isa == aClass;

}

如果调用这两个方法的是对象,isa指针指向的是对象的Class,如果调用这两个方法的是Class,isa指针指向的是类的元类,接下来通过一张图介绍一下对象,类,元类之间的关系:


如图:Father为继承自NSObject的类,Son为继承自Father的类,接下来,咱们通过几个实例来验证上述方法的正确性:

  Son *sonObject = [Son new];

Father *fatherObject = [Father new];

BOOL ret1 = [Son isKindOfClass:[fatherObject class]];//0

BOOL ret2 = [sonObject isKindOfClass:[Father class]];//1

BOOL ret3 = [Son isMemberOfClass:[fatherObject class]];//0

BOOL ret4 = [sonObject isMemberOfClass:[Father class]];//0

NSLog(@"%d------%d-------%d-------%d",ret1,ret2,ret3,ret4);

打印结果:


分析这四个问题答案的过程如下:

 /*

Son->(isa)MetaClassOfSon->(superClass)MetaClassOfFather->(superClass)MetaClassOfNSObjetc->(superClass)NSObject->(superClass)nil

[father class] = Father

*/

BOOL ret1 = [Son isKindOfClass:[fatherObject class]];//0

/*

sonObject->(isa)Son->(superClass)Father->(superClass)NSObject->(superClass)nil

[Father class] = Father

*/

BOOL ret2 = [sonObject isKindOfClass:[Father class]];//1

 /*

Son->(isa)MetaClassOfSon

[fatherObject class] = Father

*/

BOOL ret3 = [Son isMemberOfClass:[fatherObject class]];//0

/*

sonObject->(isa)Son

[Father class] = Father

*/

BOOL ret4 = [sonObject isMemberOfClass:[Father class]];//0




转载于:https://juejin.im/post/5aeaab466fb9a07aca79ff88

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值