Fork me on GitHub

NSInvocation的简单使用

写在前面

在平时的开发中,可能有这样一个需求,别人给你方法名,给你参数,叫你去执行此方法,比如:在OC-JS交互时可能会遇到,那么我们怎么处理呢?我们调用方法最常见的是 [obj func...]; performSelector目前的需求[obj func...];肯定是不行了,使用performSelector可行,但是,它只可以处理不多余2个参数的情况,那么多余2个的怎么处理呢?可能会想到不就是想传多给参数吗?就把参数包装为 NSDictionary 来处理吧,对,是一个处理方案。but现在就是不想用包装的方式。其实用 NSInvocation是可以解决的,现在就随便说下他的使用方法吧。

代码实现

  • 有如下的方法:
1
2
3
- (void)test:(NSString *)a b:(NSString *)b c:(NSString *)c d:(NSString *)d {
NSLog(@"test: %@, %@, %@, %@", a, b, c, d);
}
  • 现在给你Target 方法名(字符串)参数(数组) 需要你调用此方法
1
2
3
id target = self;
NSString *methodName = @"test:b:c:d:";
NSArray *array = @[@"1", @"22", @"2233", @"c"];
  • 可以如下实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- (void)testWithTarget:(id)target  SELString:(NSString *)sel parameters:(NSArray *)parameters {
// 创建SEL
SEL selector = NSSelectorFromString(sel);
// 创建NSMethodSignature
NSMethodSignature *signature = [target methodSignatureForSelector:selector];
// 创建NSInvocation
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
// 设置target
invocation.target = target;
// 设置SEL
invocation.selector = selector;
// 增加参数
[parameters enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
[invocation setArgument:&obj atIndex:idx+2];
}];
// 开始调用
[invocation invoke];
}
- END -
扫一扫上面的二维码图案,加我微信

文章作者:梁大红

特别声明:若无特殊声明均为原创,转载请注明,侵权请联系

版权声明:署名-非商业性使用-禁止演绎 4.0 国际