一、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
]
就是操作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
网友评论