NSMethodSignature和NSInvocation的使用(方法传多参数)

动态调用方法时会用到,例子

-(NSString *)myMethod:(NSString *)param1 withParam2:(NSNumber *)param2 

    NSString *result = @"objc"; 
    NSLog(@"par = %@",param1); 
    NSLog(@"par 2 = %@",param2); 
    return result; 
}

-(void)invokeMyMethodDynamically 

    SEL selector = @selector(myMethod:withParam2:); 
    NSMethodSignature *methodSignature = [[self class] instanceMethodSignatureForSelector:selector];//获得类和方法的签名 
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature]; 
    //从签名获得调用对象 
    [invocation setTarget:self]; 
    //设置target 
    [invocation setSelector:selector];//设置selector 
    NSString *returnValue = nil; 
    NSString *argument1 = @"fist"; 
    NSNumber *argument2 = [NSNumber numberWithInt:102]; 
    [invocation setArgument:&argument1 atIndex:2];//设置参数,第一个参数index为2 
    [invocation setArgument:&argument2 atIndex:3]; 
    [invocation retainArguments];//retain一遍参数 
    [invocation invoke];//调用 
    [invocation getReturnValue:&returnValue];//得到返回值,此时不会再调用,只是返回值 
    NSLog(@"return value = %@",returnValue); 
}

时间: 2024-11-04 11:36:01

NSMethodSignature和NSInvocation的使用(方法传多参数)的相关文章

swift向方法传数组参数的语法

总是记不住向方法中传数组参数的语法,所以记录一下. func calculateStatistics(scores:[Int]) -> (min:Int,max:Int,sum:Int) { var min = scores[0] var max = scores[0] var sum = 0 for score in scores { if score>max { max=score } else if score<min{ min=score } sum += score } ret

EasyUI queryParams属性 在请求远程数据同时给action方法传参

http://www.cnblogs.com/iack/p/3530500.html?utm_source=tuicool EasyUI queryParams属性 在请求远程数据同时给action方法传参 属性名 属性值类型 描述 默认值 queryParams object 在请求远程数据的时候发送额外的参数. 代码示例: $('#dg').datagrid({ queryParams: { name: 'easyui', subject: 'datagrid' } }); {} Actio

spring mvc 控制器方法传数组对象的一些经验

因为项目需要在一个表单里面提交多个对象,比较好的做法就是直接在控制器方法参数里传一个数组. 由于Spring mvc框架在反射生成控制方法的参数对象的时候会调用这个类的getDeclaredConstructor方法来获得构造函数, 但是一直报NoSuchMethodException的异常. 根据这个方法的jdk文档,这个类是一个数组对象时,这个方法会抛出java.lang.NoSuchMethodException,因为接口.数组类.void.基本类型没有构造函数. 同事后来给我支了两招,使

方法传参

关于方法传参: (参数也叫 参变量 ,它是专属于方法体的局部变量!) 首先我想先说一个结论:基本数据类型作形参时,实参向形参传递的是值:引用数据类型作形参时传递的是 对象.(其实传递都是值,具体可参考http://www.cnblogs.com/wsw-blog/articles/my-bolgs-898558572.html)    我们知道在调用带参方法时需要按照该方法的形参变量列表将类型.顺序一 一对应的实参变量的值传递过去. 这就是方法的参数传递! 当基本数据类型作为形参时,无论形参变量

CCLuaObjcBridge调Objective-C方法传索引数组报invalid key to &amp;#39;next&amp;#39;错调试

CCLuaObjcBridge是cocos2d-x系列引擎与Objective-C进行交互的"桥梁",老廖的quick-cocos2d-x在其framework进行了简单了封装,封装到了luaoc类中,大体能够看成: luaoc.callStaticMethod = CCLuaObjcBridge.callStaticMethod 函数原型例如以下: --[[ 调用Objective-C中的静态方法 @param string className 类名 @param string me

javascript 字符串方法传参

javascript 字符串方法传参由于嵌套的单引号,双引号过多.有点混乱.. 正确方法如下: '   <td align="left"><input type="button"  id="btnBack" value="确定" class="bigbt"  onclick="continuePassword(\''+cardnumber+'\')"/></

MyBatis dao层 方法传参

MyBatis dao层 方法传参有三种方法. 1. 以下标的方法获取参数. <update id="insertSuccessKilled">       INSERT ignore INTO success_killed(seckill_id,user_phone,state)VALUES (#{0},#{1},1) </update> 2. 以map作为dao方法中的参数,通过使用key和类型来获取参数. <select id=" sele

C#中的方法传参与switch、if结构(4)

一.方法传参的2种方式 1.按值传递  传递的是值的副本,值会更改但未保留,值最终并未更改 2.按引用传递(形参用ref关键字修饰)[P86页]  传递的是地址,值会更改且保留,值最终更改了 3.C#调试 A.设置断点  B.启动调试(也可以按F5)  C.观察变量的值   执行[F10逐过程]或[F11逐语句] F11,进入方法调试.. 二.C#中switch结构 1.语法 switch(int\char\string)  {  case 常量表达式: .....有代码,break必须有   

Eclipse如何给main方法传参数

import java.util.Arrays; /**  * 这是一个测试类,用来研究main方法的传值问题  * @author HHB  */ public class Test { /**  * 这是类的主方法,用来接受用户的输入,并将输入数据保存到一个String类型的数组里  * @param args  */ public static void main(String[] args) { System.out.println(Arrays.toString(args));//打印