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。


本文深入探讨了iOS开发中的KVC(Key-Value Coding)底层原理,包括KVC的设值与取值流程,并详细分析了Method Swizzling的常见坑点及解决方案。通过对Method Swizzling的源码解析,展示了如何在运行时替换方法实现。同时,文章介绍了如何自定义KVC,以满足特定需求。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



