iOS 切面编程 Aspects 图解
2017-07-20 本文已影响654人
youlianchun
Aspects原理图:
Aspects.png对于原作者Aspects存在一个bug和一个严重缺陷
原作者的Aspects对于类方法和实例方法的同时拦截无法进行,git上最新demo实际跑下来的结果结果是直接崩溃(不知道你们碰到没有),类方法拦截和实例方法拦截同时使用就会出现IMP找不到的情况导致崩溃。还有一个不足的地方就是采用AspectPositionInstead替换原本的方法体后,若原本方法需要调用super方法,这时候无能为力了,这是一个很严重的缺陷!比方说替换-[UIWiewController viewDidLoad:]方法。
改进后的MethodAspects
MethodAspects对与Aspects相比,除了相似的使用接口外,还增加了结构体支持,super方法调用,采用更高效的参数传递方式,支持同时对类方法和实例方法进行拦截。
原理图:
测试对象:
@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