iOS 在下面 AOP 程序

概念

在软件业。AOP对于Aspect Oriented Programming缩写,手段:面向方面的编程。它是一种函数式编程张燕生风扇类型。通过这样一个技术方案功能的预编译和动态代理统一维护执行。的基本功能是:录,性能统计,安全控制。事务处理,异常处理等等。基本的意图是:将日志记录,性能统计。安全控制,事务处理。异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离。我们希望能够将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。

运用

这里举个样例,我们有个方法sumA:andB:, 用来返回ab之和的一个字串,我们在这种方法前和方法后都添加个一段代码

  • 在执行方法前我们把參数改成2和3, 当然这里是演示用,实际用的时候别改參数,不然其它同事真的要骂人了
  • 在执行方法后我们输出传入的參数和返回值
- (void)clickTestAop:(id)sender
{
AopTestM *test = [[AopTestM alloc] init];
NSLog(@"run1");
[test sumA:1 andB:2]; NSString *before = [XYAOP interceptClass:[AopTestM class] beforeExecutingSelector:@selector(sumA:andB:) usingBlock:^(NSInvocation *invocation) {
int a = 3;
int b = 4; [invocation setArgument:&a atIndex:2];
[invocation setArgument:&b atIndex:3]; NSLog(@"berore fun. a = %d, b = %d", a , b);
}]; NSString *after = [XYAOP interceptClass:[AopTestM class] afterExecutingSelector:@selector(sumA:andB:) usingBlock:^(NSInvocation *invocation) {
int a;
int b;
NSString *str; [invocation getArgument:&a atIndex:2];
[invocation getArgument:&b atIndex:3];
[invocation getReturnValue:&str]; NSLog(@"after fun. a = %d, b = %d, sum = %@", a , b, str);
}]; NSLog(@"run2");
[test sumA:1 andB:2]; [XYAOP removeInterceptorWithIdentifier:before];
[XYAOP removeInterceptorWithIdentifier:after]; NSLog(@"run3");
[test sumA:1 andB:2];
} - (NSString *)sumA:(int)a andB:(int)b
{
int value = a + b;
NSString *str = [NSString stringWithFormat:@"fun running. sum : %d", value];
NSLog(@"%@", str); return str;
}

我们运行这段代码的时候,大伙猜猜结果是啥.结果例如以下

2014-10-28 22:52:47.215 JoinShow[3751:79389] run1
2014-10-28 22:52:52.744 JoinShow[3751:79389] fun running. sum : 3
2014-10-28 22:52:52.745 JoinShow[3751:79389] run2
2014-10-28 22:52:52.745 JoinShow[3751:79389] berore fun. a = 3, b = 4
2014-10-28 22:52:52.745 JoinShow[3751:79389] fun running. sum : 7
2014-10-28 22:52:52.745 JoinShow[3751:79389] after fun. a = 3, b = 4, sum = fun running. sum : 7
2014-10-28 22:52:52.746 JoinShow[3751:79389] run3
2014-10-28 22:52:52.746 JoinShow[3751:79389] fun running. sum : 3

实现原理

用Objective-C强大的runtime.

我们知道当给一个对象发送一个方法的时候, 假设当前类和父类都没实现该方法的时候就会走转发流程

  • 动态方法解析 -> 高速消息转发 -> 标准消息转发

迷茫的同学请搜 "Objective-C 消息转发".

了解了消息转发,那么我们aop的思路就来了,我们是先干掉原本的方法funa,这样当给对象发送方法的时候就会走转发流程,我们再hook了对象的高速消息转发方法,把实现funa的对象指成我们的aop对象, 最后在aop对象的标准消息转发里运行before instead after方法.

详细的代码欢迎大伙去github下载, 记得给咱点个star

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

iOS 在下面 AOP 程序的更多相关文章

  1. iOS开发:保持程序在后台长时间运行

    iOS开发:保持程序在后台长时间运行 2014 年 5 月 26 日 / NIVALXER / 0 COMMENTS iOS为了让设备尽量省电,减少不必要的开销,保持系统流畅,因而对后台机制采用墓碑式 ...

  2. iOS后台挂起程序 当程序到后台后,继续完成Long-Running Task 任务

    我们知道,到我们程序从前台退到后台(安home)键后,将执行程序的委托方法. // 当应用程序掉到后台时,执行该方法 - (void)applicationDidEnterBackground:(UI ...

  3. iOS开发UI篇—程序启动原理和UIApplication

    iOS开发UI篇—程序启动原理和UIApplication   一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就 ...

  4. iOS设置app应用程序文件共享

    1.iOSapp应用程序文件共享 当我们用itnues连接到设备时,在应用程序栏目下面,文件共享下,点击 对应的程序,即可以在程序右边栏目里面看到应用程序共享的数据, 此时,我们可以通过右下角的 添加 ...

  5. iOS开发UI篇—程序启动原理和UIApplication1

    iOS开发UI篇—程序启动原理和UIApplication   一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就 ...

  6. IOS中公布应用程序,进度条一直不走怎么处理

    在IOS中公布应用程序非常是喜闻乐见. 近期1周.我更新了6次版本号.可是时不时的会卡住,进度条不走. 最后总结了几个原因. 1.在公布前你要确认自己的证书是否配置正确 2.DNS域名server有没 ...

  7. IOS 后台挂起程序 当程序到后台后,继续完成Long-Running Task 任务

    我们知道,到我们程序从前台退到后台(安home)键后,将执行程序的委托方法. // 当应用程序掉到后台时,执行该方法 - (void)applicationDidEnterBackground:(UI ...

  8. 【原】iOS学习之应用程序的启动原理

    最近看视频了解了一下应用程序的启动原理,这里就做一个博客和大家分享一下,相互讨论,如果有什么补充或不同的意见可以提出来! 1.程序入口 众所周知,一个应用程序的入口一般是一个 main 函数,iOS也 ...

  9. Spring学习之第一个AOP程序

    IOC和AOP是Spring的两大基石,AOP(面向方面编程),也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP). 在进行 OOP 开发时,都是基于对 ...

随机推荐

  1. net 面向接口框架

    Asp.net 面向接口框架之应用程序上下文作用域组件 在团队中推广面向接口开发两年左右,成果总体来说我还是挺满意的,使用面向接口开发的模块使用Unity容器配置的功能非常稳定,便于共享迁移(另一个项 ...

  2. redis来共享各个服务器的session,并同时通过redis来缓存一些常用的资源,加快用户获得请求资源的速度(转)

    时间过得真快,再次登录博客园来写博,才发现距离上次的写博时间已经过去了一个月了,虽然是因为自己找了实习,但这也说明自己对时间的掌控能力还是没那么的强,哈哈,看来还需不断的努力啊!(这里得特别说明一下本 ...

  3. 网页favicon.ico图标设置(转)

    随便打开一个网页:比如 http://www.baidu.com/ 可以看到在浏览器的标签头上面显示了一个图标,这个图标是:,也就是我们常说的favicon.ico. 由于这篇文章主要讨论favico ...

  4. c#抓取动态页面WebBrowser

    在ajax横行的年代,很多网页的内容都是动态加载的,而我们的小爬虫抓取的仅仅是web服务器返回给我们的html,这其中就 跳过了js加载的部分,也就是说爬虫抓取的网页是残缺的,不完整的,下面可以看下博 ...

  5. Jersey框架二:Jersey对JSON的支持

    Jersey系列文章: Jersey框架一:Jersey RESTful WebService框架简介 Jersey框架二:Jersey对JSON的支持 Jersey框架三:Jersey对HTTPS的 ...

  6. 福利 城市名的python list

    ["上海","北京","北京市","朝阳","朝阳区","海淀","元 ...

  7. Eclipse中的SVN的冲突解决方案详解

    版本冲突原因: 假设A.B两个用户都在版本号为100的时候,更新了kingtuns.txt这个文件,A用户在修改完成之后提交kingtuns.txt到服务器,这个时候提交成功,这个时候kingtuns ...

  8. Android自己定义控件实战——仿淘宝商品浏览界面

    转载请声明出处http://blog.csdn.net/zhongkejingwang/article/details/38656929 用手机淘宝浏览商品详情时,商品图片是放在后面的,在第一个Scr ...

  9. 提高SQL执行效率

    原文地址:http://www.cnblogs.com/hlxs/archive/2012/05/07/2487082.html 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 ...

  10. windows phone (23) ScrollViewer元素

    原文:windows phone (23) ScrollViewer元素 ScrollViewer类表示可包含其他可见元素的可滚动区域,一般会用在屏幕的宽度和高度不够用时,作为一种延伸使用,参考书上称 ...