ios NSInvocation基本使用

为什么要NSInvocation,NSInvocation比performSelector 调用方法,根据方法名可以传递三个参数

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
  
    // performSelector 只能 根据方法名调用 2个参数
    // 传递一个参数例子
    [self performSelector:@selector(callWithNumber:andContent:) withObject:@"110"];
    // 传递二个参数例子
    [self performSelector:@selector(callWithNumber:andContent:) withObject:@"110" withObject:@"吃放了"];
    
    //    [self invocation];
    
    
}

-(void)invocation
{
    //1.创建签名:方法名称|参数|返回|谁拥有它,和方法的调用没有关系
    NSMethodSignature *signature = [ViewController instanceMethodSignatureForSelector:@selector(callWithNumber:andContent:withStatus:)];
    
    
    //创建NSInvocation
    /*
     */
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
    invocation.target = self;
    invocation.selector = @selector(callWithNumber:andContent:withStatus:);
    
    NSString *number = @"15376321";
     NSString *content = @"11222";
     NSString *status = @"睡觉";
    //self and _cmd 0-1已经被占用了,已经被方法占用了
    [invocation setArgument:&number atIndex:2];
    [invocation setArgument:&content atIndex:3];
    [invocation setArgument:&status atIndex:4];
    
    [invocation invoke];
//    return invocation;
    
}


-(NSString *)call
{
    NSLog(@"call--");
    return @"wre";
}

-(void)callWithNumber:(NSString *)number
{
    NSLog(@"call--%@",number);
}

-(void)callWithNumber:(NSString *)number andContent:(NSString *)content
{
    NSLog(@"call--%@--%@",number,content);
}

-(void)callWithNumber:(NSString *)number andContent:(NSString *)content withStatus:(NSString *)status
{
    NSLog(@"call--%@--%@---%@",number,content,status);
}

猜你喜欢

转载自blog.csdn.net/dreams_deng/article/details/106643992