码迷,mamicode.com
首页 > 移动开发 > 详细

iOS中AOP与Method Swizzling 项目中的应用

时间:2015-09-16 14:04:13      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:

引子:项目中需要对按钮点击事件进行统计分析,现在项目中就是在按钮的响应代码中添加点击事件,非常繁琐。所以使用了AOP(面向切面编程),将统计的业务逻辑统一抽离出来。

项目中添加的开源库:https://github.com/steipete/Aspects

Method Swizzling 利用runtime交换了函数 SEL A,IMP A 与 SEL  B,IMP B,这一黑魔法使得抽离业务逻辑变的可能。

更多资料可以参考:http://www.cocoachina.com/ios/20150120/10959.html

 

我处理的过程是新建了一个类用于处理AOP,暂且叫Aspect类

+ (void)load {

    [super load];

    [Aspect sharedInstance];

+ (instancetype)sharedInstance {

    static CGAspect *_shared = nil;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        _shared = [[CGAspect alloc] init];

    });

    return _shared;

- (instancetype)init

{

    self = [super init];

    if (self) {

        [self CG_hook_UIButton];

    }

    return self;

-(void)CG_hook_UIButton {

    [UIButton aspect_hookSelector:@selector(sendAction:to:forEvent:) withOptions:0 usingBlock:^(id<AspectInfo> info) {

        UIButton *btn = [info instance];

        NSString *str = btn.buriedPointTag;

        if (str.length > 0) {

    //在这里处理统计的模块

        }

    } error:NULL];

}

主要说明一下hook的方法,apects对hook有了很好的封装,第一参数是需要hook的SEL,第二个参数是一个枚举状态,表示你所hook得方法与第三个参数(block)的执行顺序,具体可以参见枚举说明。第三个block参数中可以获取到info,通过 [info instance]可以获取到调用的实例对象,在这里是个button。

btn.buriedPointTag的属性是专门用来处理统计的按钮的标签,当然你也可以用原生的tag标签,我这里主要是为了完全抽离这里的逻辑。

 

以下是为button添加buriedPointTag的方法

- (NSString *)buriedPointTag

{

    return objc_getAssociatedObject(self, UIButton_buriedPoint_key);

}

- (void)setBuriedPointTag:(NSString *)buriedPointTag

{

    objc_setAssociatedObject(self, UIButton_buriedPoint_key, buriedPointTag, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

这样就轻松的把按钮的统计做好,当然你的产品要对别的控制也做统计,你仍然需要去额外处理,你也可以用这种方法对别的类型的统计业务进行抽离,具体情况需要看需求有没有必要这么处理。

 

iOS中AOP与Method Swizzling 项目中的应用

标签:

原文地址:http://www.cnblogs.com/qianhongqiang/p/4813029.html

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