NSInvocaion使用

本文介绍如何利用NSInvocation实现动态方法调用,尤其适用于传递三个以上参数的情况。通过实例展示了如何设置目标对象、选择器及参数,并获取返回值。

 当我们动态执行某个方法,同时传递三个以上参数时,不能使用performSelector,此时可以使用NSInvocaion,例如下面:

-(void)printNumber:(NSNumber *)num num2:(NSNumber *)num2 num3:(NSNumber *)num3
{
NSLog(@"%@,%@,%@",num,num2,num3);
}
NSMethodSignature *signture = [[self class] instanceMethodSignatureForSelector:@selector(printNumber:num2:num3:)];

NSInvocation *invocaiton = [NSInvocation invocationWithMethodSignature:signture];
[invocaiton setSelector:@selector(printNumber:num2:num3:)];
[invocaiton setTarget:self];
NSNumber *num1 = [NSNumber numberWithInt:53];
NSNumber *num2 = [NSNumber numberWithInt:63];
NSNumber *num3 = [NSNumber numberWithInt:73];
[invocaiton setArgument:&num1 atIndex:2];
[invocaiton setArgument:&num2 atIndex:3];
[invocaiton setArgument:&num3 atIndex:4];
[invocaiton invoke];

 

 

 

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

-(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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值