iOS调用方法---NSInvocation的使用

在 iOS中可以直接调用 某个对象的消息 方式有2种

一种是performSelector:withObject:

再一种就是NSInvocation,   invocation英文单词就是调用的意思

第一种方式比较简单,能完成简单的调用。但是对于>2个的参数或者有返回值的处理,那就需要做些额外工作才能搞定。那么在这种情况下,我们就可以使用NSInvocation来进行这些相对复杂的操作

NSInvocation可以处理参数、返回值。会java的人都知道反射操作,其实NSInvocation就相当于反射操作。

下面这个例子描述了如何使用NSInvocation,以下例子中如果要正常运行,需要把不存在的类进行正确填写。

        SEL subStringSel = @selector(substringFromIndex:);
        
        //初始化NSMethodSignature对象
        NSMethodSignature *methodSignature = [[NSString class] instanceMethodSignatureForSelector:subStringSel];
        
        //初始化NSInvocation对象
        NSInvocation *myInvocation = [NSInvocation invocationWithMethodSignature:methodSignature];
        
        //设置target
        [myInvocation setTarget:string];
        
        //设置selector
        [myInvocation setSelector:subStringSel];
        
        //设置参数
        int arg1 =  2;
        [myInvocation setArgument:&arg1 atIndex:2];//参数从2开始,index 为0表示target,1为_cmd
        
        //获取结果
        NSString *resultString = nil;
        [myInvocation invoke];
        [myInvocation getReturnValue:&resultString];
        NSLog(@"2=%@",resultString);  

- (void)testClassMethod{  
    NSString *string = nil;  
      
    //初始化NSMethodSignature对象  
    NSMethodSignature *sig = [NSString methodSignatureForSelector:@selector(stringWithString:)];  
      
    //初始化NSInvocation对象  
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig];  
      
    //设置执行目标对象  
    [invocation setTarget:[NSString class]];  
      
    //设置执行的selector  
    [invocation setSelector:@selector(stringWithString:)];  
      
    //设置参数  
    NSString *argString = @"test method";  
    [invocation setArgument:&argString atIndex:2];  
      
    //执行方法  
    [invocation retainArguments];  
    [invocation invoke];  
      
    //获取返回值  
    [invocation getReturnValue:&string];  
      
    NSLog(@"执行结果 ====%@",string);  
}  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值