美文网首页
runtime的消息交换

runtime的消息交换

作者: Tonyliu_ | 来源:发表于2018-04-20 17:20 被阅读0次

Method Swizzing

顾名思义,就是讲2个方法进行交换,由原来的  A---MethodA_A  B---Method_B,变为 A---Method_B  B---Method_A

Method Swizzing有什么用处呢?

比如说我们想统计每一个ViewController展示给用户的次数,我们可以在每个ViewController里的ViewDidApper里添加跟踪代码,但是这个过于麻烦,需要在每个ViewController里写重复的代码。
  • 我们可以创建一个子类,但是需要创建UIViewController、UITableViewController、UINavigationController以及UIKit里的ViewController的子类,同样会很麻烦
  • 在这种情况下我们就可以使用Method Swizzing

Method Swizzing相关函数介绍

1、获取一个方法的SEL

class_getInstanceMethod(Class _Nullable cls, SEL _Nonnull name)
  • 参数一:方法所在类
  • 参数二:方法名

2、获取一个方法的IMP

class_getMethodImplementation(Class _Nullable cls, SEL _Nonnull name) 

3、添加一个方法

class_addMethod(Class _Nullable cls, SEL _Nonnull name, IMP _Nonnull imp, const char * _Nullable types) 
  • 参数一:添加方法所在类
  • 参数二:添加方法名
  • 参数三:指向一个方法实现的指针
  • 参数四:参数类型的说明(方法返回值,参数等信息)

4、用一个方法替换另外一个方法

class_replaceMethod(Class _Nullable cls, SEL _Nonnull name, IMP _Nonnull imp, const char * _Nullable types)

5、交换方法

method_exchangeImplementations(Method _Nonnull m1, Method _Nonnull m2)

Method Swizzling 注意要点

一、在+load()方法中实现

Objective-C在运行时会自动调用类的两个方法+load和+initialize。+load会在类初始加载时调用, +initialize方法是以懒加载的方式被调用的,如果程序一直没有给某个类或它的子类发送消息,那么这个类的 +initialize方法是永远不会被调用的。所以Swizzling要是写在+initialize方法中,是有可能永远都不被执行。

二、使用dispatch_once 中执行

    Swizzling会改变全局状态,所以在运行时采取一些预防措施,使用dispatch_once就能够确保代码不管有多少线程都只被执行一次。如果不写进行了偶数次的交换,就相当于没有交换。

参考文章:runtime 黑魔法 Method Swizzing http://zhangzr.cn/2018/02/06/iOS%E5%BC%80%E5%8F%91-runtime-%E9%BB%91%E9%AD%94%E6%B3%95Method-swizzling/

runtime 如何使用https://halfrost.com/how_to_use_runtime/

相关文章

  • Runtime 的应用

    前面我们说到:Runtime 消息传递机制Runtime 消息转发机制Runtime 交换方法今天我们来谈谈Run...

  • runtime的消息交换

    Method Swizzing Method Swizzing有什么用处呢? 我们可以创建一个子类,但是需要创建U...

  • iOS 防止方法未实现造成的崩溃

    实现原理基于runtime的方法交换和消息发送机制 方法交换 method_exchangeImplementat...

  • RunTime

    1.使用消息发送机制创建对象,给对象发送消息 2. runTime方法交换的使用 3. KVO本质其实也是runtime

  • runtime 消息转发、方法交换

    今天整理了iOS中相比较难一点的知识,但是作为一个iOS开发者,必须要掌握的技术点。下面我来描述下runtime机...

  • runTime常用方法

    使用runTime改变实例成员的值 使用runtime来交换两个方法 注意再次调用该方法不交换 使用runTime...

  • iOS - Runtime - 概念和方法交换

    runtime的概述runtime的相关概念runtime消息机制消息传递动态方法解析消息转发runtime的作用...

  • 查看SDK调用支付宝参数

    使用runtime 方法交换openurl

  • Runtime

    runtime运行时机制1:通过runtime,实现方法交换(交换两个类方法、交换两个实例方法)2:通过runti...

  • runtime的理解(二)

    主要内容 利用 runtime 交换方法 利用 runtime 动态添加方法 利用 runtime 动态添加属性 ...

网友评论

      本文标题:runtime的消息交换

      本文链接:https://www.haomeiwen.com/subject/yxjzkftx.html