一個小小的category測試記錄
OC
原始方法

分類A:

打印:
2022-08-05 17:25:34.478427+0800 categorytest[8166:2349174] aaaa分類會覆蓋掉類的方法實現(xiàn)
新增分類B

打印
2022-08-05 17:29:35.359009+0800 categorytest[8287:2353507] bbbb分類B的方法實現(xiàn)覆蓋掉A的方法實現(xiàn)
這里做一步文件切換操作


分類A.m移動到分類B.m下面,重新測試打印
2022-08-05 17:31:43.329272+0800 categorytest[8345:2355915] aaaa文件編譯順序影響了分類同名方法執(zhí)行順序,文件在下的文件先執(zhí)行.
原理
Category編譯之后底層結構是struct category_t,里面存儲著分類的對象方法、類方法、屬性、協(xié)議信息。程序運行的時候,runtime將category的數(shù)據(jù)合并到類信息中,并且分類信息位于類信息前面。分類方法是后編譯的優(yōu)先調用。
Swift
同一模塊內, 同名extension方法報錯

利用frameworka突破同名方法extension限制
打印APP的aaaa
framework的framea aaaa方法沒有打印
增加frameworkb同名方法,去掉APP的同名

報錯使用aaaa()不明確
結論: Swift在編譯層已經阻止了這種同名方法拓展行為,利用framework的拓展,仍然使用的本模塊內的方法.
PS: 面試題中最常問的,往往是同名category執(zhí)行順序,這個問題的前提是這個oc的編譯執(zhí)行順序,而swift的編譯階段直接就會報錯.