iOS 切面编程 Aspects 图解

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容