isKindOfClass就是一个循环,先获取调用者(对象或者类)的isa,然后跟传入的类进行比较;
如果不相等,就获取调用者(对象或者类)的isa的父类,跟传入的类进行比较;
如果不相等,就获取调用者(对象或者类)的isa的父类的父类,跟传入的类进行比较;
。
。
。
一直到nil,如果还没有相等就返回NO;
isKindOfClass:源码分析
// Calls [obj isKindOfClass]
BOOL
objc_opt_isKindOfClass(id obj, Class otherClass)
{
#if __OBJC2__
if (slowpath(!obj)) return NO;
//获取isa,
//如果obj 是对象,则isa是类,
//如果obj是类,则isa是元类
Class cls = obj->getIsa();
if (fastpath(!cls->hasCustomCore())) {
// 如果obj 是对象,则在类的继承链进行对比,
// 如果obj是类,则在元类的isa中进行对比
for (Class tcls = cls; tcls; tcls