iOS 底层探索篇 —— KVC 底层原理

1. Method Swizzling的坑与应用

1.1 method-swizzling 是什么?

Method-Swizzling实际就是更换方法所对应的实现函数,其主要作用是在运行时将一个方法的实现替换成另一个方法的实现,这就是我们常说的iOS黑魔法。method-swizzling最常用的应用是防止数组、字典等越界崩溃
在这里插入图片描述
下面的代码是否会无限递归呢?答案是不会的,因为交换方法后,lg_studentInstanceMethod实际上是通过[self personInstanceMethod]调用的,而 [self lg_studentInstanceMethod] 则是调用 personInstanceMethod,所以不会无限递归。
在这里插入图片描述

1.2 坑点

坑点1:method-swizzling使用过程中的确保执行一次

所谓的一次性就是:mehod-swizzling写在load方法中,而load方法会主动调用多次,这样会导致方法的重复交换,无法确保是否交换成功。
如何解决这个问题呢?

解决方案

可以通过单例设计原则,在OC中可以通过dispatch_once实现单例,这样就可以使方法交换只执行一次
在这里插入图片描述

坑点2:子类没有实现,父类实现了

如果交换的方法在子类没有实现,在父类里面实现了,那么交换的时候会不会报错呢?
在这里插入图片描述

运行后发现报错了。这是因为,personInstanceMethod已经被交换成了lg_studentInstanceMethod。而在lg_studentInstanceMethod里面调用了[self lg_studentInstanceMethod],而LGPerson里面是没有lg_studentInstanceMethod方法的,所以抱错。
在这里插入图片描述
为什么要有[self lg_studentInstanceMethod]呢?这是因为如果在满足一定条件下,那么就还会走原有的逻辑。比如数组越界,如果index < array.count, 那么就还走原有的逻辑。

解决方案

先通过class_addMethod尝试给自己添加要交换的方法,如果添加成功,即类中没有这个方法,则通过class_replaceMethod进行替换,如果添加失败则代表有这个方法,正常进行method_exchangeImplementations

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值