大家都知道iOS开发中的所有类都来源于(继承自)NSObject,那NSObject来自于哪里?它的底层结构是什么?下面我们来分析下。
通过对源码分析得到:

图一
我们常用的Class是由C层的objc_class编译后得到的,而objc_class又是继承自objc_object,objc_object又是在C层经过编译后得到NSObject,所以万物皆来自objc_object,即万物皆对象。
图二
查看objc_object发现,里面都有一个isa,通过继承关系和编译,NSObject和Class都具有isa属性。

图三
那这里的isa有什么左右?下面来一张著名的isa走向图

图四
上一遍关于isa的进阶理解我们知道了isa对于当前类的意义(存放了类的信息),其实我们还可以通过位运算(与固定mask做&运算)得到如上图虚线的走势图,这也是isa的另一作用。实例对象—>类—>元类—>根元类—>根元类,根元类继承自NSObject,NSObject的isa又指向根元类形成了一个循环。对象和类比较好理解,那什么是元类和根元类?类的归属来自于元类,存放了类的所有信息,包括类方法等。元类的定义和创建是由编译器完成。同样的道理可以推导出根元类的作用。
图一里可以看出类的结构,通过指针平移我们分析得出class_data_bits_t bits里存放了类的属性和方法。

图五
总结:通过isa我们可以得到类或者元类对象,然后通过指针偏移找到变量或者实例方法或者类方法(图五),这也是消息传递的路径,isa在runtime起到了重要作用,当然这也只是runtime的冰山一角。