# 13、用“方法调配技术”调试“黑盒方法”

类的方法列表会把选择子的名称映射到相关的方法实现上，使得“动态消息派发系统”能够据此找到应该调用的方法。这些方法均以函数指针的形式来表示，这种指针叫`IMP`，其原型如下：

```objectivec
id (*IMP)(id, SEL, ...)
```

​ “方法调配”（method swizzling）

```objectivec
// 获取方法实现
Method class_getInstanceMethod(Class aClass, SEL aSelector)
// 交换两个方法的实现
void method_exchangeImplementations(Method m1, Method m2)
```

​ 使用可以看这篇： [iOS\_Runtime是什么？原理？作用？怎么实现weak？使用](https://blog.csdn.net/Margaret_MO/article/details/104501913)后面的举例。

要点：

* 在运行期，可以向类中新增或替换选择子所对应的方法实现
* 使用另一份实现来替换原有的方法实现，这到工序叫做“方法调配”，开发者常用此技术向原有实现中添加新功能
* 一般来说，只有调试程序时才需要在运行期修改方法实现，这种做法不易滥用
