NSInvocation 入门

2018-07-15  本文已影响0人  本本的开心牧场

最近在开源项目中看到NSInvocation这个类,赶紧充电

调研了一下,发现在iOS开发中,可以直接调用方法(SEL)的方式有两种performSelector:withObject:NSInvocation
但是前者只能传一个参数,
NSInvocation是一个消息调用类,它包含了所有OC消息的成分:targetselector、参数以及返回值。NSInvocation可以将消息转换成一个对象,消息的每一个参数能够直接设定,而且当一个NSInvocation对象调度时返回值是可以自己设定的。一个NSInvocation对象能够重复的调度不同的目标(target),而且它的selector也能够设置为另外一个方法签名。NSInvocation遵守NSCoding协议,但是仅支持NSPortCoder编码,不支持归档型操作。

给你一段代码,自己体会

- (void)viewDidLoad {
    [super viewDidLoad];
    UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 80, 45)];
    UIButton *btn2 = [[UIButton alloc] initWithFrame:CGRectMake(100, 200, 80, 45)];
    
    [self.view addSubview:btn];
    [self.view addSubview:btn2];
    

    SEL method = @selector(setBackgroundColor:);
    //创建一个函数签名,这个签名可以是任意的,但需要注意,签名函数的参数数量要和调用的一致。
//    NSMethodSignature *sig = [UIButton instanceMethodSignatureForSelector:method];
    //通过签名初始化
//    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig];
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIButton instanceMethodSignatureForSelector:method]];
    [invocation setSelector:method];

    UIColor *color = [UIColor blueColor];
//    传参
//    这里设置参数的Index 需要从2开始,因为前两个被selector和target占用
    [invocation setArgument:&color atIndex:2];
//    //设置 调用对象
    [invocation invokeWithTarget:btn];
    [invocation invokeWithTarget:btn2];
    
}
上一篇下一篇

猜你喜欢

热点阅读