/**
可以传递多个参数的performSelector
@param aSelector 方法选择器
@param objects 参数数组(注意数量和类型要和s选择器保持一致)
@return 返回值,方法无返回值时返回nil
*/
-(id)performSelector:(SEL)aSelector withObjects:(NSArray *)objects{
//获得返回值
id resnvalue=nil;
//生成方法签名
NSMethodSignature *sig = [[self class] instanceMethodSignatureForSelector:aSelector];
//生成invocation
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig];
// 设置调用对象
invocation.target = self;
//设置方法选择器
invocation.selector = aSelector;
//传递进来的参数个数,设置的参数必须从2开始;因为0和1 已经被self ,_cmd 给占用了
NSInteger num = sig.numberOfArguments -2;
//取得参数的数量;
NSInteger min = MAX(num, objects.count);
//循环设置参数
for (int i = 0; i< min; i++) {
id obj = objects[i];
if ([obj isKindOfClass:[NSNull class]]) continue;
//设置参数
[invocation setArgument:&obj atIndex:i+2];
}
//调用方法
[invocation invoke];
//方法签名的返回值类型
const char *sigretun = sig.methodReturnType;
//方法签名返回值长度; 如果是字符串返回8,数字返回4,没有返回值返回0;
NSUInteger siglength = sig.methodReturnLength;
if (siglength !=0) { //有返回值
//返回对象类型
if (strcmp(sigretun, "@") == 0) {
[invocation getReturnValue:&resnvalue];
}else if (strcmp(sigretun, "i") == 0){
//返回数值类型
int a = 0;
[invocation getReturnValue:&a];
resnvalue = @(a);
}
}
//最终返回值
return resnvalue;
}