首先看一段代码
BOOL re1 = [(id)[NSObject class] isKindOfClass:[NSObject class]]; //
BOOL re2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]]; //
BOOL re3 = [(id)[LGPerson class] isKindOfClass:[LGPerson class]]; //
BOOL re4 = [(id)[LGPerson class] isMemberOfClass:[LGPerson class]]; //
NSLog(@" 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 re6 = [(id)[NSObject alloc] isMemberOfClass:[NSObject class]]; //
BOOL re7 = [(id)[LGPerson alloc] isKindOfClass:[LGPerson class]]; //
BOOL re8 = [(id)[LGPerson alloc] isMemberOfClass:[LGPerson class]]; //
NSLog(@" re5 :%hhd\n re6 :%hhd\n re7 :%hhd\n re8 :%hhd\n",re5,re6,re7,re8);
来我们看下输出结果
image.png
原理分析
看下isKindOfClass
的类方法&实例方法实现
+ (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = self->ISA(); tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
- (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
isMemberOfClass
的类方法&实例方法实现
+ (BOOL)isMemberOfClass:(Class)cls {
return self->ISA() == cls;
}
- (BOOL)isMemberOfClass:(Class)cls {
return [self class] == cls;
}
然后我们再看一张非常漂亮的isa
走位图
从图中看出一下几点
- 跟元类的
isa
指向了自己
NSObject
的superclass
为空 (循环出口)- 跟元类的
superclass
指向了NSObject
结果分析
-
result1 :1
NSObject
与NSObject
类方法对比
1.NSObject
与NSObject
的元类即跟元类 不相等
2.NSObject
与 根元类的父类即根类
相等,返回1 -
result2 :0
NSObject
与NSObject
类方法对比-
NSObject
与NSObject
的元类即根元类
不相等
-
-
result3 :0
LGPerson
与LGPerson
类方法对比
1.LGPerson
与LGPerson
的元类即元类LGPerson
不相等
2.LGPerson
与 元类LGPerson
的父类即根元类
不相等
3.LGPerson
与根元类
的父类即根类
不相等
4.LGPerson
与根类
的父类即nil
不相等 -
result4 :0
LGPerson
与LGPerson
类方法对比
1.LGPerson
与元类
不相等 -
result5 :1
NSObject
与NSObject
实例方法对比
1.NSObject
与 对象的isa
即NSObject
根类 相等 -
result6 :1
NSObject
与NSObject
类方法对比
1.NSObject
与 对象的类即NSObject
根类 相等 -
result7 :1
LGPerson
与LGPerson
类方法对比
1.LGPerson
与 对象的isa
即LGPerson
相等 -
result8 :1
LGPerson
与LGPerson
类方法对比
1.LGPerson
与 对象的类即LGPerson
相等
网友评论