Swizzling的使用
在oc的runtime机制内有一类方法是可以用来实现类间的方法替换。解决了我们实际开发中诸多常规手段所无法解决的问题。关于Method Swizzling,这里有一篇介绍基本用法的文章
场景
最近出于某种原因,我翻阅了MJRefresh的源码,其中该库就使用了方法交换策略。
在其UICollectionView
和UITableView
的类别里我发现该库使用了以下代码。于是分析了下其为何如此做的原因。
使用源码如下:
分析
这里先介绍下load
的方法的执行方式。load
方法是NSObject的方法,NSObject则是oc里大部分类的基类。只要类被添加到runtime中,load的方法均会被调用,而且只会自动被调用一次(除非你自行有调用了次方法,不过一般不会这样做)。其调用方式是执行顺序是 类 -> 子类 ->分类 ,例如A继承与B会先执行B的load
再执行A的load
,如果分类实现了load
方法也是一样会先执行类的load
再执行此类的分类里的load
方法。因此,此方法是不会被覆盖。
MJRefresh为了替换oc类tableview大专栏 Swizzling的使用e>和
collectionview
的reloadData以达到调用其自定义的mj_reloadDataBlock
,因此实现了分别定义了类别UITableView(MJRefresh)
和UICollectionView(MJRefresh)
并重写了类方法load
。在load
方法里MJRefresh做了一件事情就是使用runtime里的method_exchangeImplementations
方法来实现用mj_reloadData
替换tableview
和collectionview
里的reloadData
方法。
在mj_reloadData
的方法里我们看到其为了该方法能既能执行原有的reloadData
方法又能执行mj_reloadDataBlock
,他先调用了[self mj_reloadData]
然后有调用了mj_reloadDataBlock
。由于方法被交换过,因此此处的[self mj_reloadData]
会调用reloadData
方法并不会造成死循环,同时也达到了其目的调用原有的reloadData
方法。
但是这里我也发现了一个问题,既然方法交换了,如果你调用了[self mj_reloadData]
方法则会变成调用reloadData
方法,那样岂不是会达到效果?在这里MJRefresh为了不让你这样做,则是将mj_reloadData
做为私有方法,没有公开API,你是无法直接调用到的(当然你想调用还是调用的到的,这里就不多做讨论)。
总结
从此处设计,能看出来method_exchangeImplementations
的runtime方法的使用场景以及如何运用的思路。在此做了分析记录,也为以后如果碰到一些类似场景提供一些新的解决思路和方式。
Swizzling的使用的更多相关文章
- runtime 第四部分method swizzling
接上一篇 http://www.cnblogs.com/ddavidXu/p/5924597.html 转载来源http://www.jianshu.com/p/6b905584f536 http:/ ...
- Objective-C Runtime 运行时之四:Method Swizzling
理解Method Swizzling是学习runtime机制的一个很好的机会.在此不多做整理,仅翻译由Mattt Thompson发表于nshipster的Method Swizzling一文. Me ...
- 【原】iOS动态性(三) Method Swizzling以及AOP编程:在运行时进行代码注入
概述 今天我们主要讨论iOS runtime中的一种黑色技术,称为Method Swizzling.字面上理解Method Swizzling可能比较晦涩难懂,毕竟不是中文,不过你可以理解为“移花接木 ...
- Method Swizzling
学习博客: http://www.cocoachina.com/ios/20160121/15076.html (这个作者太牛了,写了我一直想知道的类簇的swizz方法) 一. 一般的swizz 先给 ...
- Texture tiling and swizzling
Texture tiling and swizzling 原帖地址:http://fgiesen.wordpress.com If you’re working with images in your ...
- oc swizzling 真的好用
Objective-C的hook方案(一): Method Swizzling 在没有一个类的实现源码的情况下,想改变其中一个方法的实现,除了继承它重写.和借助类别重名方法暴力抢先之外,还有更加灵活 ...
- Objective-C 利用OC的消息机制,使用Method Swizzling进行方法修改
功能:修改父类不可修改函数方法,函数方法交换 应用场景:假如我们使用的他人提供一个的framework,.m已被打包成二进制.a无法修改源码,只留下.h头文件,那假如代码中某个函数出现了问题可以通过这 ...
- Method Swizzling (方法调配)
Method Swizzling是改变一个selector的实际实现的技术.通过这一技术,我们可以在运行时通过修改类的分发表中selector对应的函数,来修改方法的实现. 例如,我们想跟踪在程序中每 ...
- iOS中AOP与Method Swizzling 项目中的应用
引子:项目中需要对按钮点击事件进行统计分析,现在项目中就是在按钮的响应代码中添加点击事件,非常繁琐.所以使用了AOP(面向切面编程),将统计的业务逻辑统一抽离出来. 项目中添加的开源库:https:/ ...
- Method Swizzling和AOP(面向切面编程)实践
Method Swizzling和AOP(面向切面编程)实践 参考: http://www.cocoachina.com/ios/20150120/10959.html 上一篇介绍了 Objectiv ...
随机推荐
- 远程调用shell脚本文件和远程复制文件
1.安装sshpass yum install sshpass 2.本地调用远程服务器的shell脚本文件: sshpass -p sa ssh root@192.168.56.105 -C &quo ...
- Qt QGraphicsScene||GraphicsView函数刷新多次内存溢出问题
需将QGraphicsScene *scene = new QGraphicsScene;放入上面声明头文件中声明: cpp文件中声明: 使用: 需要添加这个 scene->clear(); 这 ...
- 关于volatile关键字
来源:衡阳网站优化 在java核心卷1中对volatile关键字是这么描述的: volatile关键字为实例域的同步访问提供了一种免锁机制.如果声明一个域为volatile,那么编译器和虚拟机就知道该 ...
- The website is API(3)
网络爬虫实战知识准备: Requests库.robots(网络爬虫排除标准).BeautifulSoup库 一.Re正则表达式 1. 简洁地表达一组字符串 通用的字符串表达框架 字符串匹配 编译: 2 ...
- 对象数组和for循环遍历输出学生的信息
public class Student { private int no; private String name; private int age; public Student(int no, ...
- poj-3661 Running(DP)
http://poj.org/problem?id=3661 Description The cows are trying to become better athletes, so Bessie ...
- Base64转PDF、PDF转IMG(使用pdfbox插件)
--添加依赖 <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox --><dependency> ...
- hdu 2586 How far away ?(LCA模板)(倍增法)
在dfs的过程中维护三个数组: deep[i],表示i点在树中的深度: grand[x][i],表示x的第2^i个祖先的节点编号: dis[x][i],表示x到它2^i祖 #include<io ...
- Helvetic Coding Contest 2019 差A3 C3 D2 X1 X2
Helvetic Coding Contest 2019 A2 题意:给一个长度为 n 的01序列 y.认为 k 合法当且仅当存在一个长度为 n 的01序列 x,使得 x 异或 x 循环右移 k 位的 ...
- 从二叉搜索树到AVL树再到红黑树 B树
这几种树都属于数据结构中较为复杂的,在平时面试中,经常会问理解用法,但一般不会问具体的实现,所以今天来梳理一下这几种树之间的区别与联系,感谢知乎用户@Cailiang,这篇文章参考了他的专栏. 二叉查 ...