iOS(swift) oc与swift方法拓展测试

一个小小的category测试记录

OC

原始方法


分类A:

打印:
2022-08-05 17:25:34.478427+0800 categorytest[8166:2349174] aaaa
分类会覆盖掉类的方法实现
新增分类B

打印
2022-08-05 17:29:35.359009+0800 categorytest[8287:2353507] bbbb
分类B的方法实现覆盖掉A的方法实现
这里做一步文件切换操作


分类A.m移动到分类B.m下面,重新测试打印
2022-08-05 17:31:43.329272+0800 categorytest[8345:2355915] aaaa
文件编译顺序影响了分类同名方法执行顺序,文件在下的文件先执行.

原理

Category编译之后底层结构是struct category_t,里面存储着分类的对象方法、类方法、属性、协议信息。程序运行的时候,runtime将category的数据合并到类信息中,并且分类信息位于类信息前面。分类方法是后编译的优先调用。

Swift

同一模块内, 同名extension方法报错

利用frameworka突破同名方法extension限制

打印APP的aaaa
framework的framea aaaa方法没有打印

增加frameworkb同名方法,去掉APP的同名


报错使用aaaa()不明确
结论: Swift在编译层已经阻止了这种同名方法拓展行为,利用framework的拓展,仍然使用的本模块内的方法.

PS: 面试题中最常问的,往往是同名category执行顺序,这个问题的前提是这个oc的编译执行顺序,而swift的编译阶段直接就会报错.

你可能感兴趣的:(iOS(swift) oc与swift方法拓展测试)