Category

作者: Johnny_Wu | 来源:发表于2021-06-26 16:27 被阅读0次

一、Category结构

Category有它自己的结构: 截屏2021-06-26 下午3.17.16.png

比如说一个类Person,有分类Person_A和Person_B。那么在编译完成后,分类Person_A和Person_B会对应生成category_t(Person_A)和category_t(Person_B)。现阶段只是生成了分类自己的category_t结构,还未合并到Person类里面。从category_t,我们可以看到分类可以添加方法,协议,属性。

二、合并过程:

合并阶段是通过runtime来完成了
1、先读取出该类所有的category_t,这边包括A和B
2、然后从category_t提取出方法,协议等。比如提取出方法后,归类放到一个方法二维数组中:
methodLists=
[
[A_method1,A_method2], ---类别A
[B_method1,B_method2], ---类别B
]

3、开始合并到主类的方法列表中,这里先回顾下类的结构: 截屏2021-06-26 下午3.32.51.png

就是操作class_rw_t里面的methods。如上图,把分类的方法合并到class_rw_t的methods里面。每一个节点就是一个分类或者之前的方法列表。如上图的第一个method_list_t可能是Person_A分类的所有方法组成的数组。

4、合并时候,是先放分类方法数组,最后才是原来的方法数组。这样就解释了是先执行分类的方法。那分类之间有什么顺序关系吗?这就的看分类的编译顺序了,后编译的,先添加,所有如果分类A和B有同样的方法test,如果B后编译,那么执行的是B分类的方法test。编译顺序看下图: 截屏2021-06-26 下午3.13.05.png

相关文章

网友评论

      本文标题:Category

      本文链接:https://www.haomeiwen.com/subject/pwdzyltx.html