美文网首页
NSInvocation 入门

NSInvocation 入门

作者: 本本的开心牧场 | 来源:发表于2018-07-15 14:40 被阅读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];
        
    }
    

    相关文章

      网友评论

          本文标题:NSInvocation 入门

          本文链接:https://www.haomeiwen.com/subject/fvjppftx.html