iOS-Method Swizzle 简介

在没有一个类的实现源码的情况下,想改变其中一个方法的实现,除了继承它重写、和借助类别重名方法之外,还有更加灵活的方法 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); 

你可能感兴趣的:(iOS-Method Swizzle 简介)