类的结构分析之isa的作用

大家都知道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的冰山一角。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容