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