美文网首页iOS 开发iOS Developer
iOS 切面编程 Aspects 图解

iOS 切面编程 Aspects 图解

作者: youlianchun | 来源:发表于2017-07-20 16:34 被阅读654次

    Aspects原理图:

    Aspects.png

    对于原作者Aspects存在一个bug和一个严重缺陷

    原作者的Aspects对于类方法和实例方法的同时拦截无法进行,git上最新demo实际跑下来的结果结果是直接崩溃(不知道你们碰到没有),类方法拦截和实例方法拦截同时使用就会出现IMP找不到的情况导致崩溃。还有一个不足的地方就是采用AspectPositionInstead替换原本的方法体后,若原本方法需要调用super方法,这时候无能为力了,这是一个很严重的缺陷!比方说替换-[UIWiewController viewDidLoad:]方法。

    改进后的MethodAspects

    MethodAspects对与Aspects相比,除了相似的使用接口外,还增加了结构体支持,super方法调用,采用更高效的参数传递方式,支持同时对类方法和实例方法进行拦截。
    原理图:

    MethodAspects.png

    测试对象:

    @interface ObjectS : NSObject
    -(CGRect)function1:(CGPoint)size;
    -(int)function2:(NSString*)str p:(int)i;
    +(NSString*)classFunction:(NSString*)str;
    @end
    @implementation ObjectS
    -(CGRect)function1:(CGPoint)size{
        return CGRectMake(0, 0, 100, 100);
    }
    -(int)function2:(NSString*)str p:(int)i {
        NSLog(@"super %s %@", __func__, str);
        return 1;
    }
    +(NSString*)classFunction:(NSString*)str {
        return @"class_classFunction";
    }
    @end
    @interface Object : ObjectS
    -(void)function:(NSString*)str;
    -(CGRect)function1:(CGPoint)size;
    -(int)function2:(NSString*)str p:(int)i;
    +(NSString*)classFunction:(NSString*)str;
    @end
    @implementation Object
    -(void)function:(NSString*)str {
        NSLog(@"self %s %@", __func__, str);
    }
    -(CGRect)function1:(CGPoint)size {
        return CGRectMake(0, 0, 0, 100);
    }
    -(int)function2:(NSString*)str p:(int)i {
        NSLog(@"self %s %@", __func__, str);
        return [super function2:str p:i];
    }
    +(NSString*)classFunction:(NSString*)str {
        NSLog(@"self %s %@", __func__, str);
        return [super classFunction:str];
    }
    @end
    

    MethodAspect源码demo: https://github.com/youlianchun/MethodAspects_Demo

    相关文章

      网友评论

        本文标题:iOS 切面编程 Aspects 图解

        本文链接:https://www.haomeiwen.com/subject/nqhjkxtx.html