在iOS开发中,有时需要动态调用某个方法。这个时候,若不想硬编码去实现,使用performSelector就是一种常用的解决方案。本文将介绍如何使用performSelector轻松实现iOS动态方法调用。
一、了解performSelector
performSelector是NSObject类的一个方法,其定义为:
- (nullable id)performSelector:(SEL)aSelector;
从方法的定义可以看出,performSelector可以执行指定的方法。它采用的是Objective-C中的动态调用机制。
二、performSelector的使用
下面是performSelector的使用方式:
1.多参数方法调用
在不使用performSelector的情况下,假设有一个方法:
- (void)doSomethingWithInt:(int)i str:(NSString *)str;
是一个带有两个参数的方法。那么如何调用它呢?
传统的方式是使用[对象 doSomethingWithInt:i str:str]来调用。下面介绍使用performSelector调用多参数方法。
使用performSelector调用方法,需要通过NSInvocation来封装方法调用。NSInvocation是一个对象,用于封装方法调用的目标、消息和参数。
具体的步骤如下:
① 创建NSInvocation对象,将方法调用方法和target对象进行封装。代码如下:
SEL selector = @selector(doSomethingWithInt:str:);
NSMethodSignature *sig = [target methodSignatureForSelector:selector];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig];
invocation.target = target;
invocation.selector = selector;
注意:target是你想要调用的对象,selector是想调用的方法,这里sel是定义一个选择器。
② 设置参数
NSInvocation包装的目标方法可能带有多个参数,这时需要在NSInvocation中设置参数。如下:
int i = 10086;
NSString *str = @"performSelector";
[invocation setArgument:&i atIndex:2]; // 第一个参数的下标是2
[invocation setArgument:&str atIndex:3]; // 第二个参数的下标是3
注意:第一个参数的下标从2开始,因为前两个下标已经被占用了。另外,如果传递的参数是对象,则需要使用取地址符 &来传递。
③ 执行方法调用并获取返回值
[invocation invoke];
if (sig.methodReturnLength > 0) {
// 获取返回值
id anObject;
[invocation getReturnValue:&anObject];
}
在实现调用的时候,我们就可以通过performSelector间接的调用,并带有多参数,就像下面这样:
[target performSelector:@selector(doSomethingWithInt:str:) withObject:@[@(i), str]];
不难发现,performSelector方式对于调用多参数的方法来说更加简洁明了。
2.使用字符串调用方法
performSelector还可以通过字符串的方式调用某个方法。这种方式的好处在于,它可以在运行期动态的选择要调用的方法。代码如下:
[target performSelector:NSSelectorFromString(@"doSomethingWithInt:str:") withObject:@[@(i), str]];
3.延迟调用方法
performSelector还可以实现方法的延迟调用。比如让某个方法在2秒之后调用。代码如下:
// 方式一:
[target performSelector:@selector(doSomethingWithInt:str:) withObject:@[@(i), str] afterDelay:2];
// 方式二:
[target performSelector:NSSelectorFromString(@"doSomethingWithInt:str:") withObject:@[@(i), str] afterDelay:2];
需要注意的是,在使用performSelector方法调用延迟执行的方法时,被调用的方法必须没有参数。
三、performSelector方法的限制
虽然performSelector方法可以实现动态调用方法,但是它却有比较多的限制。
1.方法必须是可见的,否则无法调用
2.只能调用无参数或者只有一个参数的方法
3.参数类型必须是基元类型,也就是说参数必须是数字或者是对象类型
4.如果想调用的方法名称是字符串,则方法名必须是Objective-C合法的
5.调用的方法必须有返回值或者返回对象
四、总结
performSelector方法是iOS开发中常用的一种方法,它可以方便地实现动态调用方法的功能。但是,在使用performSelector方法的时候,仍需要注意一些限制。相信通过学习这篇文章,你已经了解了performSelector的基本用法,希望本文对你有所帮助。