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 ...
随机推荐
- 常用STL的常见用法
//#pragma comment(linker, "/STACK:1024000000,1024000000") //#pragma GCC optimize(2) //#inc ...
- 1)PHP基础介绍
1.php基础介绍: Perssonal Home Page ====>PHP 2.应用范围 · web服务器脚本语言 命令行脚本语言 应用程序图形界面 3.PHP运行环境 PHP解释 ...
- G. Minimum Possible LCM
https://codeforces.com/contest/1154/problem/G #include<bits/stdc++.h> using namespace std; typ ...
- tc/traffic control 网络控制工具
第一个例子 增加延时 tc qdsic add dev enp0s3 root netem delay 200ms qdisc : queuing discipline, 当内核需要发送包到某个接口时 ...
- Cell theory|Bulk RNA-seq|Cellar heterogeneity|Micromanipulation|Limiting dilution|LCM|FACS|MACS|Droplet|10X genomics|Human cell atlas|Spatially resolved transcriptomes|ST|Slide-seq|SeqFISH|MERFISH
生物信息学 Cell theory:7个要点 All known living things are made up of one or more cells. All living cells ar ...
- idea maven Running C:\Users\Administrator\AppData\Local\Temp\archetype1tmp
Running C:\Users\Administrator\AppData\Local\Temp\archetype1tmp 在IDEA中通过maven项目管理工具创建javaweb项目的时候一直卡 ...
- 007.前端开发知识,前端基础CSS(2020-01-28)
一.布局 一列固定宽度且居中 两列左窄右宽型 通栏平均分布型 1.一列固定宽度且居中布局<body> .top+.banner+.main+.footer 按Tab键,得到下框中代码 &l ...
- vue 起步(一)
准备 安装nodejs(下载),Windows 安装包(.msi) npm相关 打开cmd查看npm版本, npm -v,如果没有安装npm,执行npm install npm -g进行安装 查询当前 ...
- LeetCode No.82,83,84
No.82 DeleteDuplicates 删除排序链表中的重复元素 II 题目 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 输入: 1->2 ...
- 林轩田机器学习基石课程学习笔记5 — Training versus Testing
上节课,我们主要介绍了机器学习的可行性.首先,由NFL定理可知,机器学习貌似是不可行的.但是,随后引入了统计学知识,如果样本数据足够大,且hypothesis个数有限,那么机器学习一般就是可行的.本节 ...