NSInvocation的使用

在iOS中方法调用的方式:
第一种方式

  • (id)performSelector:(SEL)aSelector;
  • (id)performSelector:(SEL)aSelector withObject:(id)object;
  • (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;
    第二种方式
    NSInvocation
    如果参数多于两个,比较适合使用第二种方式
#import "ViewController.h"
#import 
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
//    方法签名
    //初始化NSMethodSignature
//    1.类方法 NSObject中的方法
//    NSMethodSignature *signature = [ViewController instanceMethodSignatureForSelector:@selector(run1:eat:)];//方法有两个参数
//   2.对象方法 NSObject中的方法
    NSMethodSignature *signature1 = [self methodSignatureForSelector:@selector(eatFood)];//方法有一个参数
//    3.类方法 NSMethodSignature中的方法
        NSMethodSignature *signature = [NSMethodSignature signatureWithObjCTypes:"v@:@"];//此处设置了一个参数
    //此时我们应该判断方法是否存在,如果不存在这抛出异常
    if (signature == nil) {
        //aSelector为传进来的方法
        NSString *info = [NSString stringWithFormat:@"%@方法找不到", NSStringFromSelector(@selector(run:))];
        [NSException raise:@"方法调用出现异常" format:info, nil];
    }
//    根据方法签名来创建NSInvocation对象
    //2、创建NSInvocation对象
    NSInvocation *invocaton = [NSInvocation invocationWithMethodSignature:signature];
//    设置方法调用者
    invocaton.target =self;
//    设置要调用的方法
    invocaton.selector = @selector(run:);//这里的方法与签名的方法可以一致也可以不一致,不一致时会调用此处设置的方法(可以在此处修改方法)
    //numberOfArguments方法获取的参数个数,包含self和_cmd,减去2之后才是签名方法中需要的参数个数
    NSArray *objects = @[@"a",@"b",@"c"];
    NSUInteger argsCount = signature.numberOfArguments-2;//签名方法的参数个数
    NSUInteger arrCount = objects.count;
    NSUInteger count = MIN(arrCount, argsCount);
    for (int i = 0; i

你可能感兴趣的:(NSInvocation的使用)