isKindOfClass和isMemberOfClass的区别

2,043 阅读1分钟

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