为什么要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);
}