一、Category結(jié)構(gòu)
Category有它自己的結(jié)構(gòu):
截屏2021-06-26 下午3.17.16.png
比如說(shuō)一個(gè)類(lèi)Person,有分類(lèi)Person_A和Person_B。那么在編譯完成后,分類(lèi)Person_A和Person_B會(huì)對(duì)應(yīng)生成category_t(Person_A)和category_t(Person_B)。現(xiàn)階段只是生成了分類(lèi)自己的category_t結(jié)構(gòu),還未合并到Person類(lèi)里面。從category_t,我們可以看到分類(lèi)可以添加方法,協(xié)議,屬性。
二、合并過(guò)程:
合并階段是通過(guò)runtime來(lái)完成了
1、先讀取出該類(lèi)所有的category_t,這邊包括A和B
2、然后從category_t提取出方法,協(xié)議等。比如提取出方法后,歸類(lèi)放到一個(gè)方法二維數(shù)組中:
methodLists=
[
[A_method1,A_method2], ---類(lèi)別A
[B_method1,B_method2], ---類(lèi)別B
]

截屏2021-06-26 下午3.32.51.png
就是操作class_rw_t里面的methods。如上圖,把分類(lèi)的方法合并到class_rw_t的methods里面。每一個(gè)節(jié)點(diǎn)就是一個(gè)分類(lèi)或者之前的方法列表。如上圖的第一個(gè)method_list_t可能是Person_A分類(lèi)的所有方法組成的數(shù)組。
4、合并時(shí)候,是先放分類(lèi)方法數(shù)組,最后才是原來(lái)的方法數(shù)組。這樣就解釋了是先執(zhí)行分類(lèi)的方法。那分類(lèi)之間有什么順序關(guān)系嗎?這就的看分類(lèi)的編譯順序了,后編譯的,先添加,所有如果分類(lèi)A和B有同樣的方法test,如果B后編譯,那么執(zhí)行的是B分類(lèi)的方法test。編譯順序看下圖:
截屏2021-06-26 下午3.13.05.png