ios NSInvocation简单使用

一般情况下方法的调用都是用 performSelector:withObject执行方法的调用。但是当参数的数量比较的多的时候,这种方法就不能简单的满足我们的需求的时候,我们就需要用到NSInvocation这个类了

首先NSInvocation只能使用系统提供的类方法来初始化实例,而不是alloc/init,对于初始化后的实例 我们要为其设置target、selector、argument(需要参数的时候设置)

代码是亲自试过的。。。

1.不带参数的NSIvocation的简单调用 

- (void)viewDidLoad {

    [superviewDidLoad];

    SEL selector =@selector(say);

    //创建一个函数签名这里的函数签名可以是任意的,但是需要注意 函数签名的参数数量要和调用的一致

    NSMethodSignature *sig =[[selfclass]instanceMethodSignatureForSelector:selector];

//    NSMethodSignature *sig =[NSNumber instanceMethodSignatureForSelector:@selector(init)]

    //通过签名初始化

    NSInvocation *invocation =[NSInvocationinvocationWithMethodSignature:sig];

    //设置target

    [invocation setTarget:self];

    //设置索引子

    [invocation setSelector:selector];

    //消息调用

    [invocation invoke];

    

}

-(void)say{

    NSLog(@"someone say");

}

最后我们会在控制台上看到打印信息了

2.带参数的NSIvocaton的调用

- (void)viewDidLoad {

    [superviewDidLoad];

    SEL selector =@selector(say:listen:);

    //创建一个函数签名这里的函数签名可以是任意的,但是需要注意 函数签名的参数数量要和调用的一致

    NSMethodSignature *sig =[[selfclass]instanceMethodSignatureForSelector:selector];

    //通过签名初始化

    NSInvocation *invocation =[NSInvocationinvocationWithMethodSignature:sig];

    //设置target

    [invocation setTarget:self];

    //设置索引子

    [invocation setSelector:selector];

    //设置参数参数在使用的时候都是取址的 如果是oc对象也是取地址

    NSString *a=@"第一个参数";

    NSString *b=@"第二个参数";

    [invocation setArgument:&aatIndex:2];//这里的index必须2开始,因为targetselector各占了一个索引,所以上面设置tagrgetselector还有另外一种写法.如下:

//    UIViewController *vc =self;

//    [invocation setArgument:&vc atIndex:0];

//    [invocation setArgument:&selector atIndex:1];

    

    [invocation setArgument:&batIndex:3];

    //消息调用

    [invocation invoke];

    

}

-(void)say:(NSString *)a listen:(NSString *)b{

    NSLog(@"说了:%@,听到:%@",a,b);

}

两种写法 控制台打印的信息也完全一样

3.有返回值得NSIvocation的调用

- (void)viewDidLoad {

    [superviewDidLoad];

    SEL selector =@selector(say:listen:);

    //创建一个函数签名这里的函数签名可以是任意的,但是需要注意 函数签名的参数数量要和调用的一致

    NSMethodSignature *sig =[[selfclass]instanceMethodSignatureForSelector:selector];

    //通过签名初始化

    NSInvocation *invocation =[NSInvocationinvocationWithMethodSignature:sig];

    //设置target

    [invocation setTarget:self];

    //设置索引子

    [invocation setSelector:selector];

    //设置参数参数在使用的时候都是取址的 如果是oc对象也是取地址

    NSString *a=@"第一个参数";

    NSString *b=@"第二个参数";

    [invocation setArgument:&aatIndex:2];

    [invocation setArgument:&batIndex:3];

    //消息调用

    [invocation invoke];

    //现在是有返回类型的我们要申明一个变量来保存这个返回值

    NSString *rtStr;

    //对于这里的返回值我们也可以自己去设置 我们这里只是取返回值

//    [invocation setReturnValue:&b];

    [invocation getReturnValue:&rtStr];

    //检查结果

    NSLog(@"%@",rtStr);

    

}

-(NSString *)say:(NSString *)a listen:(NSString *)b{

    return [NSStringstringWithFormat:@"说了:%@听到:%@",a,b];

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值