在没有一个类的实现源码的情况下,想改变其中一个方法的实现,除了继承它重写、和借助类别重名方法之外,还有更加灵活的方法 Method Swizzle。
Method Swizzle 指的是改变一个已存在的selector对应的实现 。
每个类都有一个方法列表,存放着selector的名字和方法实现的映射关系。IMP有点类似函数指针,指向具体的方法实现。
在OC中调用一个方法,其实是向一个对象发送消息,查找消息的唯一依据是selector的名字。利用OC的动态特性,可以实现在运行时偷换selector对应的方法实现。
- 原理:
OC中方法的调用能够在运行时,通过改变类的调度表中选择器到函数体的映射关系。
相关的API:
可以利用method_exchangeImplementations
来交换2个方法中的IMP。
可以利用 class_replaceMethod
来修改类。
可以利用 method_setImplementation
来直接设置某个方法的IMP。
归根结底,都是偷换了selector的IMP。
Method method1 = class_getInstanceMethod(cls, sel1);
Method method2 = class_getInstanceMethod(cls, sel2);
method_exchangeImplementations(method1, method2);
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END