美文网首页
通过runtime来实现类继承

通过runtime来实现类继承

作者: 五角 | 来源:发表于2016-12-23 16:52 被阅读0次

需求由来:今天突然接到领导分配的需求,要在之前的项目中加上友盟的统计,统计的需求也很简单,只进行界面统计,以之前的项目经验来看,就是在BaseViewController ,里面把所以的类和类名一一列出来,在ViewDidApper时候发送开始统计的方法,在viewWillDisappear时候再发送结束统计的方法。打开项目瞬间发现,有的继承了BaseViewController,有的直接继承UIViewController,瞬间懵逼了。为了保证统计的完整性,想到的办法 ,要不在没继承BaseViewController的VC里面单独添加统计方法,不过这样太浪费时间了,还有更优的办法就是让没继承BaseViewController,去继承BaseViewController,这样也还可行,但相信还有更佳的方法来解决这个问题。于是便想起了Runtime.
实现原理:Method Swizzling 原理
在Objective-C中调用一个方法,其实是向一个对象发送消息,查找消息的唯一依据是selector的名字。利用Objective-C的动态特性,可以实现在运行时偷换selector对应的方法实现,达到给方法挂钩的目的。
每个类都有一个方法列表,存放着selector的名字和方法实现的映射关系。IMP有点类似函数指针,指向具体的Method实现。
可以利用 method_exchangeImplementations 来交换2个方法中的IMP。
实现步骤:
工程目录如下图:

0BF957EA-451B-46B6-AA5B-04DED1360871.png
1.在AppDelegate中引入文件然后激活其方法
E81A3586-3ECB-4206-8BF7-46BACFA682FE.png
2.在AddUMMethod方法中来封装下Method Swizzling的方法实现,由于根据需求不同,有的需要交换类方法,有的需要交换实例方法,为了对两个方法都进行了实现。
F03EF891-820B-4C41-B3DE-0F74B9B4DDFD.png
3.到这一步就相当于是平时的那个BaseViewController,在新的方法里面去写自己需要写的方法实现了,对于我的需求来说,就是在viewDidAppear方法里去遍历得到当前的VC然后把发送开始统计的方法就完成了。为了方便看出效果在里面创建一个红色的label.
7F7C84A7-0335-41FF-8D11-371564D785B9.png
最终效果如图
A3ABD508-00E2-4CF4-BE73-ADFE4B84AF31.png
可以发现ViewController这个方法里面没写一行代码,也没继承任何类,就能成功的实现了方法继承的功能。
源码如下:https://github.com/wanglinchao/InheritWithRuntime

相关文章

  • 通过runtime来实现类继承

    需求由来:今天突然接到领导分配的需求,要在之前的项目中加上友盟的统计,统计的需求也很简单,只进行界面统计,以之前的...

  • 构造函数原型的继承方式分析

    1.通过原型链继承 综上我们可以总结出 通过原型链来实现继承的原理通过原型链来实现继承的原理原型链继承方案中,父类...

  • class

    通过class定义类/实现类的继承 在类中通过constructor定义构造方法 通过new来创建类的实例 通过e...

  • es5继承

    继承 ES5的继承也都是通过借用父类的构造方法来实现父类方法/属性的继承: // 父类 functionsupFa...

  • Python线程

    线程的创建 1.通过创建Thread类指定target来实现 2.通过继承Thread类重写run方法来实现 3....

  • 2020-10-25 Java线程

    Thread类java中一个类可以通过继承Thread类实现run()实现多线程。继承thread的类通过star...

  • Java零基础自学DAY7 2018-03-19

    类的继承 Java的继承具有单继承的特点,每个子类只有一个直接父类 继承的特点 继承通过extends关键字来实现...

  • 用Runtime做点什么(二)

    前言 其实这篇文章的重点并不在于runtime,只是我选择了用runtime扩展,而不是继承一个类的方法来实现的。...

  • 面向对象三大特性

    三大特性:继承 封装 多态 继承 Java中的继承只能单继承,但是可以通过内部类继承其他类来实现多继承。 封装 封...

  • 继承:es5 vs es6

    es5如何实现继承 es5实现继承主要是通过原型来实现的 首先实现一个父类 function Father(na...

网友评论

      本文标题:通过runtime来实现类继承

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