ios 向类中动态添加方法

@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);
    //.....
}
posted @ 2012-04-10 20:50  eeeyes  阅读(1059)  评论(1)    收藏  举报