一个小小的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的编译阶段直接就会报错.
网友评论