runtime(四) method swizzling 与AOP编程
什么是 AOP
: (site: baike.baidu.com),引用百度百科中的解释就是:
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
主要功能: 日志记录,性能统计,安全控制,事务处理,异常处理等等
主要意图: 将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
iOS 开发中的 AOP 在 Objective-C 中,类的方法列表会把选择器的名称映射到方法的实现上,这样 动态消息转发系统 就可以以此找到需要调用的方法。这些方法是以函数指针的形式来表示,这种指针叫做 IMP。 如下:
id (*IMP) (id, SEL, ...)
复制代码
Objective-C
的 runtime
机制以此提供了获取和交换映射IMP
的的接口:
// 获取方法
Method class_getInstanceMethod(Class cls, SEL name);
// 交换两个方法
void method_exchangeImplementations(Method m1, Method m2)
复制代码
我们可以通过上面两个方法来进行选择器和所映射的IMP
进行交换:
来,直接上代码示例,比如我们的要实现功能是在每个控制器的- viewDidLoad
方法里面log一下,一般有三种实现方式:
- 直接修改每个页面的 view controller 代码,简单粗暴;
- 子类化 view controller ,并让我们的 view controller 都继承这些子类;
- 使用
Method Swizzling
进行 hook,以达到AOP
编程的思想
第一种实现的代码是在每个类的里面都这么写:
- (void)viewDidLoad {[super viewDidLoad];DDLog();
}
复制代码
第二种是只在基类里面写。然后所有的控制器都继承这个基类。 最后一种是最佳的解决方案:
@implementation UIViewController (Log)
+ (void)load {static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{Class class = [self class];SEL originalSelector = @selector(viewDidLoad);SEL swizzledSelector = @selector(log_viewDidLoad);//Method originalMethod = class_getInstanceMethod(class, originalSelector);Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);//BOOL success = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));if (success) {class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));} else {method_exchangeImplementations(originalMethod, swizzledMethod);}});
}#pragma mark - Method Swizzling- (void)log_viewDidLoad{[self log_viewDidLoad];DDLog(...);
}
@end
复制代码
注意:
- 为什么使用
+ (void)load
?因为父类、子类和分类的该方法是分别调用,互不影响,而且是在类被加载的时候必定会调用的方法。
我的博客:iosgg.cn/
runtime(四) method swizzling 与AOP编程相关推荐
- 【原】iOS动态性(三) Method Swizzling以及AOP编程:在运行时进行代码注入
概述 今天我们主要讨论iOS runtime中的一种黑色技术,称为Method Swizzling.字面上理解Method Swizzling可能比较晦涩难懂,毕竟不是中文,不过你可以理解为" ...
- iOS 开发:『Runtime』详解(二)Method Swizzling
本文用来介绍 iOS 开发中『Runtime』中的黑魔法Method Swizzling. 通过本文,您将了解到: Method Swizzling(动态方法交换)简介 Method Swizzlin ...
- iOS总结-Runtime篇之黑魔法Method Swizzling的滥用会有危险吗
参考https://www.jianshu.com/p/19c5736c5d9a, http://blog.sina.com.cn/s/blog_a343f32b0101en4o.html runti ...
- Method Swizzling的各种姿势
因为Objective-C的runtime机制, Method Swizzling这个黑魔法解决了我们实际开发中诸多常规手段所无法解决的问题, 比如代码的插桩,Hook,Patch等等. 我们首先看看 ...
- iOS总结-Runtime篇之用途及面试题的总结一黑魔法Method Swizzling
runtime的用途基本分下面几类: 实现多继承Multiple Inheritance 上一篇里面的最后利用methodSignatureForSelector来进行一次转发,在forwardInv ...
- runtime实践之Method Swizzling
利用 Objective-C 的 Runtime 特性,我们可以给语言做扩展,帮助解决项目开发中的一些设计和技术问题.这一篇,我们来探索一些利用 Objective-C Runtime 的黑色技巧.这 ...
- Objective-C Runtime 运行时之四:Method Swizzling
理解Method Swizzling是学习runtime机制的一个很好的机会.在此不多做整理,仅翻译由Mattt Thompson发表于nshipster的Method Swizzling一文. Me ...
- Objective-C Runtime (三):Method Swizzling(方法替换)
Objective-C Runtime (三):Method Swizzling(方法替换) Method Swizzling是一种改变改变一个'selector'的实际实现的技术.通过这一技术,我们 ...
- 第十四章、AOP编程实现原理
1.AOP概念 AOP (Aspect Oriented Programing) ⾯向切⾯编程 = Spring动态代理开发 以切⾯为基本单位的程序开发,通过切⾯间的彼此协同,相互调⽤,完成程序的构建 ...
最新文章
- C2146和C4430错误:循环引用错误
- STM32H743+CubeMX-ADC+DMA采样四路AD
- python 配置文件解析代码_python3从零学习-5.5.2、configparser — 配置文件解析器
- python程序打包成安卓app教程_Python zipapp打包教程(超级详细)
- java smtp pop3_POP3/SMTP指令
- tcpdf html 支持css吗,TCPDF 5.1 发布,增加对CSS的支持
- 2007年河南湖北各市GDP
- 位运算求两个数的平均值
- 计算机组成知识试题及答案,2015年计算机考研:计算机组成原理试题六【附答案】...
- mysql查询4-6_MySQL学习(四)查询
- 26. PHP 文件打开/读取/读取
- 使用dll查看器dll文件中的内容
- 数据结构实验报告一 顺序表与链表
- postman中springboot上传文件Missing initial multi part boundary
- 双鱼座三:舞者与梦想家的一周
- 2011年中国城市高校数量排行榜(前十名)
- BaseDao.java
- Design Data-Intensive Applications 读书笔记三 查询语句
- Linux系统调用七、与文件权限有关的系统API串讲
- 凤凰卫视、迪士尼、百度、圣戈班、万豪、汇丰等公司高管变动