OC-NSInvocation的简单运用

    • 1.在 iOS中可以直接调用某个对象的消息方式有两种:

      • 一种是performSelector:withObject;

      • 再一种就是NSInvocation。

      • 第一种方式比较简单,能完成简单的调用。但是对于>2个的参数或者有返回值的处理,那就需要做些额外工作才能搞定。那么在这种情况下,我们就可以使用NSInvocation来进行这些相对复杂的操作。

    • 2.NSInvocation的作用:

      • 用来包装方法和对应的对象, 它可以存储方法的名称,对应的对象 ,对应的参数
    • 3.NSInvocation的使用步骤

      • (1).创建一个NSInvocation对象
      • (2).调用NSInvocation对象的invoke方法
    • 4.使用NSInvocation时的注意点

      • (1).在创建NSInvocation的时候, 必须传递一个签名对象
      • (2).给invocation设置的方法, 必须和签名中的方法一致
    • 5.NSInvocation的签名(NSMethodSignature)的使用

      • (1).签名对象的作用:
        • 用于获取参数的个数和方法的返回值
      • (2).注意点:
        • 创建签名对象的时候不是使用NSMethodSignature类创建而是方法属于谁就用谁来创建
    • 6.NSInvocation使用范例
    #import "ViewController.h"
    
    @interface ViewController ()
    @end
    
    @implementation ViewController
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        // 创建签名
        NSMethodSignature *signature = [ViewController instanceMethodSignatureForSelector:@selector(sendMessageWithNumber:andContent:status:)];
    
        // 1.创建一个NSInvocation对象
        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
    
        // 1.1保存方法所属的对象
        invocation.target = self;
    
        // 1.2保存方法名称
        // 注意:给invocation设置的方法, 必须和签名中的方法一致
        invocation.selector = @selector(sendMessageWithNumber:andContent:status:);
    
        // 1.3设置传递的参数
        // 第一个参数: 需要给指定方法传递的值
        //           + 第一个参数需要接收一个指针, 也就是传递值的时候需要传递地址
        // 第二个参数: 需要给指定方法的第几个参数传值
        NSString *number = @"10086";
    
        // 注意: 设置参数的索引时不能从0开始, 因为0已经被self占用, 1已经被_cmd占用
        [invocation setArgument:&number atIndex:2];
    
        NSString *content = @"love";
        [invocation setArgument:&content atIndex:3];
    
        NSString *status = @"success";
        [invocation setArgument:&status atIndex:4];
    
        // 2.调用NSInvocation对象的invoke方法
        // 只要调用invocation的invoke方法, 就代表需要执行NSInvocation对象中指定对象的指定方法, 并且传递指定的参数
        [invocation invoke];
    }
    
    // 不带参数的方法
    - (void)call
    {
        NSLog(@"%s", __func__);
    }
    
    // 带1个参数的方法
    - (void)callWithNumber:(NSString *)number
    {
        NSLog(@"打电话给%@", number);
    }
    
    // 带2个参数的方法
    - (void)sendMessageWithNumber:(NSString *)number andContent:(NSString *)content
    {
        NSLog(@"发信息给%@, 内容是%@", number, content);
    }
    
    // 带3个参数的方法
    - (void)sendMessageWithNumber:(NSString *)number andContent:(NSString *)content status:(NSString *)status
    {
        NSLog(@"发信息给%@, 内容是%@, 发送的状态是%@", number, content, status);
    }
    @end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值