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