iOS 分类实现原理源码分析

每个分类在编译后会生成一个category_t结构体,该结构体中存储着分类的实例方法、类方法、协议列表、属性等信息

当我们运行app时runtime运行时机制会将每个分类加到对应的类对象和元类对象里面,而且加入的时候将分类列表的数据倒序取出来,然后将里面的方法列表直接插入到rw_t的前面,之前原有的方法则挪到了最后面,这也就是为什么分类的方法(相同的方法)会优先被调用,之前说到将分类列表中的数据取出来是通过倒序,这样就说明了后编译的分类,优先被调用


class_rw_t与class_ro_t的区别:class_ro_t存储着类对象/元类原有的信息(方法、属性、协议等),也就是编译后就生成的数据(通过源码可以看出是调用realizeClass之前),class_rw_t存储着class_ro_t加上分类的信息,这里的数据可以修改,是运行时才创建的数据(调用realizeClass之后),而且平时调用方法都是从class_rw_t中查找的

分类和类扩展的区别:

        类扩展是在编译完成后会存储在class_ro_t中,而分类在编译完成后只是一个个独立的category_t结构体,在运行时才会创建class_rw_t,并且将class_ro_t的数据拷贝到class_rw_t中,分类的数据也会存储在class_rw_t中

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容