Category的底层结构
分类底层结构定义的如下:
1 | //objc-runtime-new.h |
项目中每定义一个分类,底层都会增加一个category_t对象。
Category的加载过程
Category源码阅读顺序:
- objc-os.mm (runtime入口)
- _objc_init (runtime初始化)
- map_images
- map_images_nolock
- objc-runtime-new.mm
- _read_images
- remethodizeClass
- attachCategories
- attachLists
- realloc、memmove、 memcpy
category的加载过程:
- 通过runtime加载类的所有分类
- 将所有分类的方法,属性,协议分别合并到一个数组
- 将合并后的分类数据插入到类原来到数据之前
由源码可见,对同名方法而言,会优先调用分类中的方法。如果多个分类中包含同名方法,则会调用最后参与编译的分类中的方法。
摘录源码中核心的attachCategories实现如下(objc4-756.2):
1 | // Attach method lists and properties and protocols from categories to a class. |
Category和Extension的区别
- 类扩展中的信息在编译时会合并到类信息中。
- 分类中的信息在运行时才会合并到类信息中。