@interface TestObject : NSObject -(void)printFirstName:(NSString*)firstName thenSecondName:(NSString*)secondName; -(void)printName:(NSString*)name;-(int)addLeft:(int)left withRight:(int)right; @end
@implementation TestObject -(SEL)oriSelector:(SEL)aSelector { NSString* v2String=NSStringFromSelector(aSelector); NSString* oriString=[v2String stringByReplacingCharactersInRange:NSMakeRange(0, 2) withString:@""]; return NSSelectorFromString(oriString); } -(void)changeInvocation:(NSInvocation*)invocation { SEL aSelector=[invocation selector]; [invocation setSelector:[self oriSelector:aSelector]]; } -(void)v2Method:(NSInvocation*)invocation { NSLog(@"hello"); [self changeInvocation:invocation]; [invocation invokeWithTarget:self]; NSLog(@"goodbye"); } -(void)v3Method:(NSInvocation*)invocation { NSLog(@"fuck"); [self changeInvocation:invocation]; [invocation invokeWithTarget:self]; } -(NSMethodSignature*)methodSignatureForSelector:(SEL)aSelector { NSString* vString=NSStringFromSelector(aSelector); NSString* oriString=[vString stringByReplacingCharactersInRange:NSMakeRange(0, 2) withString:@""]; NSMethodSignature* signature=[super methodSignatureForSelector:NSSelectorFromString(oriString)]; return signature; } -(void)forwardInvocation:(NSInvocation *)anInvocation { SEL aSelector=[anInvocation selector]; NSString* aSelectorString=NSStringFromSelector(aSelector); if([aSelectorString hasPrefix:@"v2"]) [self v2Method:anInvocation]; else if([aSelectorString hasPrefix:@"v3"]) [self v3Method:anInvocation]; } -(void)printFirstName:(NSString *)firstName thenSecondName:(NSString *)secondName { NSLog(@"%@ %@",firstName,secondName); } -(void)printName:(NSString*)name { NSLog(@"%@",name); } -(int)addLeft:(int)left withRight:(int)right { int value=left+right; NSLog(@"%d add %d is %d",left,right,value); return value; } @end
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { TestObject* t=[[TestObject alloc]init]; [t printFirstName:@"your" thenSecondName:@"sister"]; [t v2printFirstName:@"your" thenSecondName:@"sister"]; [t v3printName:@"your sister"]; int a=(int)[t v2addLeft:2 withRight:2]; NSLog(@"%d",a); //..... }