A的category B、C加载的同样的方法test,先执行那个分类的方法,为什么

在Objective-C中,当一个分类(category)添加了与类中已有方法同名的方法时,会触发方法交换(method swizzling)。在这种情况下,会执行分类中的方法实现,而不是原始类中的实现。

如果分类B和分类C都添加了与类A中已有方法test同名的方法,那么会根据以下规则确定先执行哪个分类的方法:

  1. 加载顺序:分类方法的执行顺序取决于它们被加载到程序的顺序。先加载的分类方法将先执行。如果分类B和分类C的加载顺序未知或者不同,那么执行的顺序也是不确定的。
  2. 运行时优先级:在某些情况下,即使两个分类同时加载,运行时优先级更高的分类中的方法将先执行。这取决于动态绑定机制和运行时环境。
  3. 代码组织:如果一个类被多个分类同时修改,那么最终的行为取决于这些分类的代码组织。如果一个分类只包含对特定方法的修改,而另一个分类包含其他修改和该方法的修改,那么包含特定方法修改的分类将先执行。

需要注意的是,方法交换和分类的使用需要谨慎处理,因为它们可能会破坏封装性、引入不确定性和性能问题。在使用这些技术时,应该仔细评估其适用性和潜在风险,并进行充分的测试和验证。

追问1:

分类的加载顺序尤什么决定

分类的加载顺序由编译器的加载顺序决定。当一个类被多个分类同时修改时,编译器的加载顺序决定了哪个分类的方法先执行。编译器按照源文件的顺序编译和链接类,因此先编译的分类将先加载并执行其方法实现。如果分类的加载顺序未知或者不同,那么执行的顺序也是不确定的。

因此,分类的加载顺序取决于编译器的加载顺序,与代码的组织和编译顺序有关。在使用分类和修改已有方法时,应该仔细评估其适用性和潜在风险,并进行充分的测试和验证,以确保程序的稳定性和可维护性。

追问2(难度高):

OC中,类Person,有方法sayHello;在分类Person+A中,也有方法sayHello,怎么在Person+A的中调用sayH

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值