Aspects原理圖:
Aspects.png
對于原作者Aspects存在一個bug和一個缺陷
原作者的Aspects對于類方法和實例方法的同時攔截無法進行昼钻,git上最新demo實際跑下來的結果結果是直接崩潰(不知道你們碰到沒有)碗淌,類方法攔截和實例方法攔截同時使用就會出現(xiàn)IMP找不到的情況導致崩潰缕探。還有一個不足的地方就是采用AspectPositionInstead替換原本的方法體后潭兽,若原本方法需要調用super方法,這時候無能為力了枚碗,這是一個很嚴重的缺陷!比方說替換-[UIWiewController viewDidLoad:]方法波丰。
改進后的MethodAspects
MethodAspects對與Aspects相比媚赖,除了相似的使用接口外,還增加了結構體支持江解,super方法調用,采用更高效的參數(shù)傳遞方式,支持同時對類方法和實例方法進行攔截。
原理圖:
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