Objective-C 下的 AOP 编程
概念
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,是函数式编程的一种衍生范型。通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。主要的意图是:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
表现
在funa方法前后加执行代码
[[XYAOP sharedInstance] interceptClass:[Test class] beforeExecutingSelector:@selector(funa) usingBlock:^(NSInvocation *invocation) { NSLog(@"funa before"); }]; [[XYAOP sharedInstance] interceptClass:[Test class] afterExecutingSelector:@selector(funa) usingBlock:^(NSInvocation *invocation) { NSLog(@"funa after"); }];
当我们执行funa的时候呢,输出如下结果
2014-10-28 17:31:01.435 testaop[7609:290860] funa before 2014-10-28 17:31:01.436 testaop[7609:290860] funa run 2014-10-28 17:31:01.436 testaop[7609:290860] funa after
实现原理
用Objective-C强大的runtime.
我们知道当给一个对象发送一个方法的时候, 如果当前类和父类都没实现该方法的时候就会走转发流程
- 动态方法解析 -> 快速消息转发 -> 标准消息转发
迷茫的同学请搜 "Objective-C 消息转发".
了解了消息转发,那么我们aop的思路就来了,我们是先干掉原本的方法funa,这样当给对象发送方法的时候就会走转发流程,我们再hook了对象的快速消息转发方法,把实现funa的对象指成我们的aop对象, 最后在aop对象的标准消息转发里执行before instead after方法.
具体的代码欢迎大伙去github下载, 记得给咱点个star
https://github.com/uxyheaven/XYQuickDevelop
在代码里搜 XYAOP.h
相关一些方法介绍
介绍一些用到的runtime方法
// 给 cls 添加一个新方法 BOOL class_addMethod ( Class cls, SEL name, IMP imp, const char *types ); // 替换 cls 里的一个方法的实现 IMP class_replaceMethod ( Class cls, SEL name, IMP imp, const char *types ); // 返回 cls 的指定方法 Method class_getInstanceMethod ( Class cls, SEL name ); // 设置一个方法的实现 IMP method_setImplementation ( Method m, IMP imp ); // 返回 cls 里的 name 方法的实现 IMP class_getMethodImplementation ( Class cls, SEL name );
时间: 2024-10-07 04:51:06