请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

runtime相关

老师您在解释分类方法覆盖宿主类方法的时候是说,分类方法添加到了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 23:23:29

抱歉,没能及时回复。
首先,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 回复 有任何疑惑可以回复我~
  • 提问者 慕婉清701190 #1
    谢谢解答
    回复 有任何疑惑可以回复我~ 2018-07-10 06:09:10
  • 老师我也有同样的疑问。
    最终分类方法与原始方法会合并,这里的“合并”是合并到哪里去了?
    情况1:合并到class_rw_t的methods上面了,查找方法时只查找class_rw_t的methods即可。即最终class_rw_t的methods的样式为:[[分类方法1],..., [原始方法]] ?
    情况2:仅仅只是分类方法添加到class_rw_t的methods上面了,原始方法仍然在class_ro_t的methods上面。查找方法时优先查找class_rw_t的methods,再查找
    class_ro_t的methods?
    
    老师,请问是情况1还是情况2,还是都不是?
    回复 有任何疑惑可以回复我~ 2019-08-11 17:50:21
  • 我已自己解决了这个问题。答案是情况1。
    
    大家可以参考这篇博客
    https://www.jianshu.com/p/823eaedb3697
    
    源码部分可以搜 realizeClass、methodizeClass 这两个方法,查看源码,可以验证上述答案。
    回复 有任何疑惑可以回复我~ 2019-08-11 18:55:48
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信