码迷,mamicode.com
首页 > 其他好文 > 详细

Objective-C 下的 AOP 编程

时间:2014-10-28 17:48:30      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:objective-c   aop   runtime   消息转发   

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
);


Objective-C 下的 AOP 编程

标签:objective-c   aop   runtime   消息转发   

原文地址:http://blog.csdn.net/uxyheaven/article/details/40543355

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!