美文网首页
NSInvocation的使用

NSInvocation的使用

作者: 沉江小鱼 | 来源:发表于2020-04-04 14:22 被阅读0次
1.NSInvocation的作用

封装了方法调用对象、方法选择器、参数、返回值等,可以给对象发送一个参数大于两个的消息

2. 优势

在iOS中可以直接给某个对象发送消息的方法有两种

  • performSelector 这种类型的方法最多只能有两个参数
  • NSInvocation 它可以设置多个参数
3. NSInvocation使用方式
  • 通过NSObject类生成方法签名
  • 通过方法签名生成NSInvaocation
  • 设置方法调用者
  • 设置方法选择器
  • 设置参数
  • 如果有返回值,获取返回值

代码演示:

- (void)test:(NSString *)name age:(NSString *)age sex:(NSString *)sex{
    NSLog(@"%@-%@-%@",name,age,sex);
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 1.通过方法调用者创建方法签名:这个方法是NSObject的方法
    NSMethodSignature *sig = [[self class] instanceMethodSignatureForSelector:@selector(test:age:sex:)];
    // 2.生成NSInvocation对象
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig];
    // 3.设置方法调用者
    invocation.target = self;
    // 4.设置方法选择器
    invocation.selector = @selector(test:age:sex:);
    // 5.设置参数
    NSString *name = @"张三";
    NSString *age = @"11";
    NSString *sex = @"男";
    // 设置的参数从2开始,因为默认有两个参数 self _cmd
    [invocation setArgument:&name atIndex:2];
    [invocation setArgument:&age atIndex:3];
    [invocation setArgument:&sex atIndex:4];
    // 6.执行方法
    [invocation invoke];

    // 7.判断方法签名 判断是否有返回值
    const char *sigretun =  sig.methodReturnType; //方法签名的返回值
    NSUInteger siglength = sig.methodReturnLength; //方法签名返回值长度; 如果是字符串返回8,数字返回4,没有返回值返回0;
    if (siglength !=0) { //有返回值
        if (strcmp(sigretun, "@") == 0) {
            NSString *returnStr;
            [invocation getReturnValue:&returnStr];
            NSLog(@"字符串返回值:%@",returnStr);
        }else if (strcmp(sigretun, "i")){
            int a = 0;
            [invocation setReturnValue:&a];
            NSLog(@"数字返回值:%zd",a);
        }
    }else{ //没有返回值
        NSLog(@"没有返回值");
    }   
}

performSelctor就不提供代码演示了。

4. NSInvocation使用场景

在与js 交互中,点击webview 上某个按钮,获取网页上的一些跳转链接;例如:ml://sendMessage_name_age_sex?name=zhangsan&age=20&sex=boy;获取链接之后,再在oc 中进行处理,获得方法名字符换(sendMessage:name:age:sex),并提取相应的参数值放到数组里面;将方法名字符串和参数一起放到NSInvocation中进行处理,进而调用oc 中

-(void)sendMessage:(NSString *)name age:(NSSring*)age sex:(NSString*)sex;
5. 常见方法及属性
//保留参数,它会将所有参数和self 都retain 一遍
-(void)retainArguments;
//判断参数是否存在,调用retainArguments之前,值为NO,调用之后值为YES
@property(readonly)Bool argumentsRetained;
6.扩展
#import "NSObject+Exception.h"

@implementation NSObject (Exception)
-(id)performSelector:(SEL)aSelector withObjects:(NSArray *)objects{
    
    //生成方法签名
    NSMethodSignature *sig = [NSMethodSignature methodSignatureForSelector:aSelector];
    if (sig == nil) { //如果方法签名不存在抛出异常
        [NSException raise:@"exceptionName" format:@"%@not found method",NSStringFromSelector(aSelector)];
    }
    //生成invocation
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig];
    invocation.target = self;// 设置调用对象
    invocation.selector = aSelector;//设置方法选择器
    
    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];
    
    //获得返回值
    id retrunvalue = nil;
    if (sig.methodReturnLength !=0) { //如果有返回值的话,获取返回值
        [invocation getReturnValue:&retrunvalue];
    }
    return retrunvalue;
}
@end

相关文章

  • NSInvocation个人理解

    NSInvocation的使用: //NSInvocation;用来包装方法和对应的对象,它可以存储方法的名称,对...

  • NSInvocation

    NSInvocation的基本使用 11 异常处理

  • NSInvocation 使用

    NSString*result1 = [selfappend:@"a"withStr2:@"b"andStr3:@...

  • NSInvocation使用

    NSInvocation NSInvocation是一个消息调用类,主要作用是存储和传递消息。它存储的信息包含了一...

  • NSInvocation的使用

    一、介绍 在 iOS中可以直接调用方法的方式有两种: 1、performSelector:withObject;2...

  • NSInvocation的使用

    在iOS中方法调用的方式:第一种方式 (id)performSelector:(SEL)aSelector; (i...

  • NSInvocation的使用

    背景 在最近的项目开发中遇到了一个很别扭的问题。项目本身是一个SDK,供业务方App集成使用。SDK内部有网络请求...

  • NSInvocation的使用

    NSInvocation的使用 1 生成需要调用方法的签名NSMethodSignature,使用根据调用的Sel...

  • NSInvocation的使用

    1.NSInvocation的作用 封装了方法调用对象、方法选择器、参数、返回值等,可以给对象发送一个参数大于两个...

  • NSInvocation的使用

    版本:iOS13.6 一、简介 通常调用方法的方式是使用[实例 方法名]或[实例 方法名:参数] 若该方法没有公开...

网友评论

      本文标题:NSInvocation的使用

      本文链接:https://www.haomeiwen.com/subject/csnbmctx.html