iOS 在下面 AOP 程序
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 程序的更多相关文章
- iOS开发:保持程序在后台长时间运行
iOS开发:保持程序在后台长时间运行 2014 年 5 月 26 日 / NIVALXER / 0 COMMENTS iOS为了让设备尽量省电,减少不必要的开销,保持系统流畅,因而对后台机制采用墓碑式 ...
- iOS后台挂起程序 当程序到后台后,继续完成Long-Running Task 任务
我们知道,到我们程序从前台退到后台(安home)键后,将执行程序的委托方法. // 当应用程序掉到后台时,执行该方法 - (void)applicationDidEnterBackground:(UI ...
- iOS开发UI篇—程序启动原理和UIApplication
iOS开发UI篇—程序启动原理和UIApplication 一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就 ...
- iOS设置app应用程序文件共享
1.iOSapp应用程序文件共享 当我们用itnues连接到设备时,在应用程序栏目下面,文件共享下,点击 对应的程序,即可以在程序右边栏目里面看到应用程序共享的数据, 此时,我们可以通过右下角的 添加 ...
- iOS开发UI篇—程序启动原理和UIApplication1
iOS开发UI篇—程序启动原理和UIApplication 一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就 ...
- IOS中公布应用程序,进度条一直不走怎么处理
在IOS中公布应用程序非常是喜闻乐见. 近期1周.我更新了6次版本号.可是时不时的会卡住,进度条不走. 最后总结了几个原因. 1.在公布前你要确认自己的证书是否配置正确 2.DNS域名server有没 ...
- IOS 后台挂起程序 当程序到后台后,继续完成Long-Running Task 任务
我们知道,到我们程序从前台退到后台(安home)键后,将执行程序的委托方法. // 当应用程序掉到后台时,执行该方法 - (void)applicationDidEnterBackground:(UI ...
- 【原】iOS学习之应用程序的启动原理
最近看视频了解了一下应用程序的启动原理,这里就做一个博客和大家分享一下,相互讨论,如果有什么补充或不同的意见可以提出来! 1.程序入口 众所周知,一个应用程序的入口一般是一个 main 函数,iOS也 ...
- Spring学习之第一个AOP程序
IOC和AOP是Spring的两大基石,AOP(面向方面编程),也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP). 在进行 OOP 开发时,都是基于对 ...
随机推荐
- hdu4487(概率dp)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4487 题意:开始位置在0,每一步可以向右向左或者不动,问走了n步后,路径中能到达最右的期望. 分析:d ...
- UVA 11100 The Trip, 2007 贪心(输出比较奇葩)
题意:给出n个包的大小,规定一个大包能装一个小包,问最少能装成几个包. 只要排序,然后取连续出现次数最多的数的那个次数.输出注意需要等距输出. 代码: /* * Author: illuz <i ...
- Unity3d之MiniJson与LitJson之间的较量
由于项目不得不用到json来解析服务器端传来的数据,于是不得不选择一种在unity3d上面可用的json.开始根据网上推荐LitJson,于是下载下来源码,导入项目: 经过测试可以用:但是移植到ipa ...
- mixpanel实验教程(2)
六.发送邮件和推送通知 选择该用户前面的 checkbox,点击 Send A Notification button,从下拉列表中选择 Email Message/Push Notifiaction ...
- CSDN博客的一些问题(友好的吐槽)--后记,有一点点改进
近期,CSDN博客真的非常不稳定,时常会出现503错误. 昨天.我发现自己的博客的訪问量仅仅有4万多,今天最终发现它变回原来的6万多了. 我写博客不是为了这个訪问量,可是,CSDN这点使用问题啦. 或 ...
- 关于Platinum库的MediaRender具体C++代码实现探讨
接上篇博文 NDK下 将Platinum SDK 编译成so库 (android - upnp) 讲述了如何利用该代码库编译给android程序调用的so库,其中也提到了,在使用sample-upnp ...
- Ubuntu下将vim配置为Python IDE(转)
工欲善其事,必先利其器. 配置好了Django的环境,该把vim好好配置一下当做python的IDE来用. 在Windows下用惯了各种现成的工具,转到Linux下,一下没了头绪……好歹google出 ...
- poj2528(线段树)
题目连接:http://poj.org/problem?id=2528 题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报 分析:离散化+线段树,这题因为每个数字其实表示的是一个单位长度,因 ...
- bootstrap之DumpWindowHierarchy
DumpWindowHierarchy package io.appium.android.bootstrap.handler; import android.os.Environment; impo ...
- lightoj1027(期望dp)
有一个迷宫,有n个门,走每个的概率都是相同的 每个门有一个数字,如果是正数ai,那么表示走ai天就能走出迷宫,如果是负数,那么走-ai天会回到原地,然后会忘记之前的事情,继续选择门去走 所以,如果都是 ...