美文网首页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 面向切面(AOP)编程 —— Aspects & Blo

    参考 iOS 面向切面(AOP)编程 —— Aspects & BlockHook

  • iOS 切面编程 Aspects 图解

    Aspects原理图: 对于原作者Aspects存在一个bug和一个严重缺陷 原作者的Aspects对于类方法和实...

  • iOS开发AOP框架Aspects源码分析

    Aspects解决的问题 Aspects是AOP(面向切面编程)思想在iOS下OC的实现。Aspects可以用于h...

  • iOS Aspects的实现原理

    Aspects是iOS上技巧性很强的一个第三方类库,主要针对于AOP编程(面向切面编程)的思想。 “面向切面编程”...

  • iOS - 切面编程 (Aspects解析)

    前言 首先我们了解几个概念,什么是切面编程?切面编程的实际应用? 切面编程(AOP):什么是切面?举个栗子:切一根...

  • Aspects 源码解读

    Aspects 源码解读 1.Aspects简介 Aspects是一种面向切面编程,相对于继承而已,无需改动目标源...

  • Aspects改进尝试

    背景 一个库:Aspects两篇文章:面向切面编程之 Aspects 源码解析及应用消息转发机制与Aspects源...

  • iOS Aspects源码剖析

    摘要:Aspects用来干什么?Aspect是一个简洁高效的用于使iOS支持AOP(面向切面编程)的框架。官方描述...

  • Aspects源码解析

    1 aspects简介 1.1 Aspect Oriented Programming简介 面向切面编程(Aspe...

  • iOS获取当前的ViewController

    更新:之前的代码,或多或少有些问题。现改用Aspects获取当前的vc。Aspects是AOP(面向切面编程)思想...

网友评论

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

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