美文网首页开发文档网络请求
iOS-Aspect简单使用(AOP)

iOS-Aspect简单使用(AOP)

作者: 大老虎_Robin | 来源:发表于2017-05-02 17:44 被阅读897次

    使用cocoapods将Aspects添加到project中。

    target 'Project' do
        use_frameworks!
        pod 'Aspects', '~> 1.4.1'
    end
    

    1.主要使用Aspects 中以下两个方法对project中进行监控

    #pragma mark - Public Aspects API
    + (id<AspectToken>)aspect_hookSelector:(SEL)selector
                               withOptions:(AspectOptions)options
                                usingBlock:(id)block
                                     error:(NSError **)error {
        return aspect_add((id)self, selector, options, block, error);
    }
    
    /// @return A token which allows to later deregister the aspect.
    - (id<AspectToken>)aspect_hookSelector:(SEL)selector
                               withOptions:(AspectOptions)options
                                usingBlock:(id)block
                                     error:(NSError **)error {
        return aspect_add(self, selector, options, block, error);
    }
    

    2.导入头文件

    #import <Aspects/Aspects.h>
    

    3.简单的使用示例

    +(void)Aspect {
        //如果对project中所有ViewController进行监控。
        //可以对UIViewController中的方法进行勾取。
        //例如:viewWillAppear:、viewDidLoad()等方法。
        [UIViewController aspect_hookSelector:@selector(viewWillAppear:) 
                                 withOptions:AspecPositionAfter 
                                  usingBlock:^(id<AspectInfo> info) {
                                      NSStirng *className = NSStringFromClass([[info instance] class]);
                                      NSLog(@"%@",className);
                                  } error:NULL];
    
        //对ViewController中方法的监控
        //例如:对ViewController中dismissHUD:(CGFloat)delayFloat;方法进行监控。
        [ViewController aspect_hookSelector:@selector(dismissHUD:) 
                                withOptions:AspectPositionAfter 
                                 usingBlock:^(id<AspectInfo> info, CGFloat delayFloat) {
                                     //调用的实例对象
                                     id instance = info.instance;
    
                                     //原始的方法
                                     id invocation = info.originalInvocation;
    
                                     //参数
                                     id arguments = info.arguments;
    
                                     //原始的方法,再次调用
                                     [invocation invoke];
    
                                     //监控方法的参数值
                                     NSLog(@"方法参数值:%f",delayFloat);
                                 }error:NULL];
    }
    

    相关文章

      网友评论

        本文标题:iOS-Aspect简单使用(AOP)

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