RunTime原理和使用

原理:消息转发:在一个实例里边使用resolveInstanceMethod方法,内部动态添加一个方法class_addMethod去实现。之所以这样实现,取决于

OC方法的组成:
SEL(方法名)
IMP(是一个函数指针,对应方法实现)
参数
相当于一本书的目录,里边标题,对应页码,页码对应具体的模块内容

在动态添加的方法里想要把原有方法传递的参数捕获到,以便自己使用,需要将自己动态添加实现的方法进行参数的补全。补全的参数是方法调用者(self),和方法编号(_cmd).

  • 那么这两个隐士参数是哪里来的呢?

OC方法的调用,底层是objc_msgSend函数,其中包含的参数有目标对象,方法名(即地址),具体传递参数。因此我们通过补全参数,通过方法编号,找到对应实现方法。

  • 缓存

当然在发送消息之前,会先查找缓存,如果缓存的方法名和传输进来要调度的目标方法名结果一致的话,直接调用。objc_msgSendunCache不一致的话,从类对象的方法列表中去查找,如果找到就调用,并在缓存中备份,cache_getImp。如果类对象方法和缓存中都没有的话,依次往父类层层查询。

使用的场景:
方法的调换

通过getClassMethod方法,由方法名获取对应的方法IMP,method_exchange交换方法的IMP(即交换SEL的指向)。此时原有方法的地址指向新方法的实现,现有方法地址指向原有方法的实现。

1:对于table view的reloaddata方法,替换成自己的方法。在对数据进行分析后,没有数据返回的给一个占位视图,存在返回数据的直接操作使用。
2:字典转模型,自动归解档操作。

你可能感兴趣的:(RunTime原理和使用)