NSInvocation

在iOS开发中,我们一般会使用以下两种方式去调用一个方法

(1) [obj methodName];
(2) [obj performSelector......];

为什么使用方法2 ?看下面需求 方式一不能通过方法名字符串来执行方法

需求1.:通过字符串调用方法

    NSString *str = @"invocationThisMethord:";
    [self performSelector:NSSelectorFromString(str) withObject:@"name" afterDelay:0];

- (void)invocationThisMethord:(NSString *)name {
    NSLog(@"invocationThisMethord %@",name);
}
 完美解决需求

需求2.:通过字符串调用下面方法

//方法名字符串
NSString *methodNameStr = @"test:withArg2:andArg3:";

我们知道[obj performSelector......]; 参数有限  怎么办?

所以我们就需要用到了NSInvocation
       //1.创建一个方法签名
    NSMethodSignature *signature = [self methodSignatureForSelector:NSSelectorFromString(methodNameStr)];
    //2.使用方法的签名来创建一个NSInvocation对象
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
    //3.给invocation的两个属性赋值 要执行谁的(target)的哪个方法(selector)
    invocation.target = self;
    invocation.selector = NSSelectorFromString(methodNameStr);
    
    //4.给要执行的方法设置参数 使用setArgument:atIndex:方法给要执行的方法设置参数,注意下标从2开始,因为0、1已经被target与selector占用
    NSString *param1 = @"param1";
    NSString *param2 = @"param2";
    NSString *param3 = @"param3";
    [invocation setArgument:&param1 atIndex:2];
    [invocation setArgument:&param2 atIndex:3];
    [invocation setArgument:&param3 atIndex:4];
    //5.执行方法
    [invocation invoke];

需求3.:通过字符串调用下面方法

NSString *methodNameStr = @"test:withArg2:andArg3:";
//要执行的方法
- (NSString *)test:(NSString *)arg1 withArg2:(NSString *)arg2 andArg3:(NSString *)arg3 {
    NSLog(@"%@---%@---%@", arg1, arg2, arg3);
}

    NSString *methodNameStr = @"test:withArg2:andArg3:";
    
    NSMethodSignature *signature = [self methodSignatureForSelector:NSSelectorFromString(methodNameStr)];
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
    invocation.target = self;
    invocation.selector = NSSelectorFromString(methodNameStr);
    
    NSString *param1 = @"param1";
    NSString *param2 = @"param2";
    NSString *param3 = @"param3";
    [invocation setArgument:&param1 atIndex:2];
    [invocation setArgument:&param2 atIndex:3];
    [invocation setArgument:&param3 atIndex:4];
    [invocation invoke];
    
    if (signature.methodReturnLength > 0) {
        NSString *result;
        [invocation getReturnValue:&result];
        NSLog(@"%@",result);
    }

2019-01-18 17:48:41.350282+0800 Test[13957:7661495] param1---param2---param3
2019-01-18 17:48:41.350437+0800 Test[13957:7661495] lalallallala
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,835评论 1 32
  • 在iOS开发中,我们一般会使用以下两种方式去调用一个方法(1) [obj methodName];(2) [obj...
    codingZero阅读 14,048评论 16 45
  • 我叫严子也可以叫我燕子我生活在c城市里虽然平凡但是我很喜欢这种惬意的日子 “燕子,你让我好找!原来是跑到这...
    梁哈哈啊阅读 1,059评论 0 0
  • 我是个矛盾又别扭的人。 爱笑却总不快乐,阳光又忧伤,害怕却假装坚强,热情又冷漠,精明却装傻,渴望却自我压抑...
    祭鱼阅读 1,696评论 0 1