Category

一、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
]

3、開(kāi)始合并到主類(lèi)的方法列表中,這里先回顧下類(lèi)的結(jié)構(gòu):
截屏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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容