Category - 底层结构
底层结构
1 | struct _category_t { |
加载处理过程
- 通过Runtime某个类的所有Category数据
- 把所有Category的方法,属性,协议数据,合并到一个在数组中
- 后面参与编译的Category数据,会在数组的前面
- 将合并后的分类数据(方法,属性,协议),插入到类原来数据的前面
- 源码解读顺序
- objc-os.mm
- _objc_init
- map_images
- map_images_nolock
- objc-runtim-new.mm
- _read_images
- remethodizeClass
- attachCategories
- attachLists
- realloc, memmove, memcpy
- objc-os.mm
部分源码分析
objc-os.mm文件
_objc_init
1 | *********************************************************************** |
map_images_nolock
1 | /*********************************************************************** |
objc-runtime-new.mm文件
_read_images
1 | /*********************************************************************** |
remethodizeClass
1 | /*********************************************************************** |
attachCategories
1 | attachCategories(Class cls, category_list *cats, bool flush_caches) |
objc-runtime-new.h
attachLists
1 | void attachLists(List* const * addedLists, uint32_t addedCount) { |
高频试题
- Category的使用场景?
- 为原有类添加对象方法和类方法
- 拆分模块,将原来一个大的模块,拆分成多个小模块,方便维护和管理
- 添加关联对象
- Cateory的实现原理
- Category编译之后的底层结构是 struct category_t,里面存储着分类 的对象方法,属性,协议信息
- 在程序运行的时候,runtime会将Category的数据,合并到类信息中(类对象,元类对象)
- Cateogyr和Class Extension的区别是什么?
- Class Extension在编译的时候,它的数据就已经包含在类信息中
- Category是在运行时,才会将数据合并到类信息中
参考
李明杰老师课件- objc源码
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ivan's Blog!
评论









