runtime相关

来源:4-3 分类相关面试问题-2

慕婉清701190

2018-07-06

老师您在解释分类方法覆盖宿主类方法的时候是说,分类方法添加到了class_rw_t的methods数组中,然后宿主方法也在这个数组中,只不过顺序进行了移动才实现覆盖的,那么class_ro_t中的methods又装的是什么?我记得课程中提过宿主的方法和属性等是放在class_ro_t中的,如果后者成立,是不是分类覆盖宿主类方法的原因是,在方法查找的时候,优先查找class_rw_t中的methods然后才是class_ro_t中的method这个原因?

如果一个class的所有的分类添加到宿主是在初始化方法中一次性添加的,那么之前的array()是哪里来的?

写回答

1回答

于海

2018-07-09

抱歉,没能及时回复。
首先,class_rw_t当中的methods是一个二维数组,它包含了类相关的可读写方法,比如分类添加的方法。同时class_rw_t是对class_ro_t的封装, class_ro_t中的merhodlist包含了类相关的只读方法,比如我们以代码方式创建的方法。
分类方法添加时机是在remethodizeClass函数内部当中开始,随后将分类方法同步到class_rw_t当中 每个分类的多个方法以一维数组形式对应到class_rw_t的methods当中的一个元素 后添加的分类在该二维数组得前面,方法查找按方法名称进行索引,那么优先匹配分类当中的方法。
你说的array()不知道你具体指的是什么,更多的内容建议你参考runtime680版本的源码进行分析和理解,希望我的答案可以帮助到你。
欢迎追问

1
4
于海
回复
CocoaKier
赞,非常建议源码阅读
2019-09-02
共4条回复

资深大牛带你深度剖析ios高级面试

从BAT/TMD名企真题入手,结合源码及应用,构建完整iOS知识体系

1749 学习 · 600 问题

查看课程