iOS 开发iOS Developer

iOS 切面编程 Aspects 图解

2017-07-20  本文已影响654人  youlianchun

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

上一篇下一篇

猜你喜欢

热点阅读