什么是runtime_runtime error什么意思

什么是runtime_runtime error什么意思[Runtime] NSInvocation

大家好,又见面了,我是你们的朋友全栈君。

当前环境: Xcode10.0 Swift4.2 iOS SDK 12.1

Demo: github.com/zColdWater/…

NSInvocation做什么的?

NSInvocation对象用于在对象之间和应用程序之间存储和转发消息,主要是通过NSTimer对象和分布式对象系统。一个NSInvocation对象包含一个Objective-C消息的所有元素:一个目标,一个选择器,参数和返回值。可以直接设置这些元素中的每一个,并在NSInvocation调度对象时自动设置返回值。 一个NSInvocation对象可以被反复派遣到不同的目标; 它的参数可以在发送之间修改以获得不同的结果; 甚至它的选择器也可以使用相同的方法签名(参数和返回类型)更改为另一个。这种灵活性NSInvocation有助于重复具有许多参数和变体的消息; 而不是为每条消息重新输入略有不同的表达式

默认情况下,此类不保留包含的调用的参数。如果这些对象可能在您创建实例NSInvocation的时间和使用它的时间之间消失,那么您应该自己显式保留对象或调用方法以使调用对象自己保留它们。retainArguments

NSInvocation怎么用?

这里我上一段Demo,或许你也可以在上面Demo的地址里面找到答案。

为了看下效果,我故意给foo函数包含2个参数,一个返回值。

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 创建 SEL 方法 二选一即可
// SEL selector = @selector(foo::);
    SEL selector1 = NSSelectorFromString(@"foo::");
    
    //---------------- 开始 获取方法签名 ----------------//
    NSMethodSignature *sign = [self methodSignatureForSelector:selector1];
    NSLog(@"numberOfArguments:%lu",sign.numberOfArguments);
    NSLog(@"frameLength:%lu",sign.frameLength);
    NSLog(@"isOneway:%d",[sign isOneway]);
    NSLog(@"methodReturnType:%s",[sign methodReturnType]);
    NSLog(@"methodReturnLength:%lu",[sign methodReturnLength]);

    
    //---------------- 结束 获取方法签名 ----------------//

    // 通过 方法签名创建 Invocation 对象
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sign];
    
    // 方法选择器 必传参数
    invocation.selector = selector1;

    
    //---------------- 开始 设置函数参数 ----------------//
    // 备注: 索引0和1分别表示隐藏的参数self和_cmd; 可以使用target和selector方法直接检索这些值。对通常在消息中传递的参数使用索引2和更大。
    // 官方文档: https://developer.apple.com/documentation/foundation/nsinvocation/1437830-getargument?language=objc
    int arg2 = 10;
    [invocation setArgument:&arg2 atIndex:2];
    
    NSString* (^arg3)(NSString *)  = ^NSString* (NSString* va1)
    {
        return va1;
    };
    [invocation setArgument:&arg3 atIndex:3];
    //---------------- 结束 设置函数参数 ----------------//

    // 开始调用
    [invocation invokeWithTarget:self];
    
    
    //---------------- 开始 插入返回值 ----------------//
    NSString *setResult = @"[替换掉方法真正的返回值]";
    [invocation setReturnValue: &setResult];
    //---------------- 结束 插入返回值 ----------------//

    
    
    //---------------- 开始 得到函数返回值 ----------------//
    id result = nil;
    [invocation getReturnValue:&result];
    NSLog(@"方法返回值:%@",result);
    //---------------- 结束 得到函数返回值 ----------------//

    
    
    //---------------- 开始 查看参数 ----------------//
    id _arg0 = nil;
    [invocation getArgument:&_arg0 atIndex:0];
    NSLog(@"arg0:%@",_arg0);

    SEL _arg1 = nil;
    [invocation getArgument:&_arg1 atIndex:1];
    NSLog(@"arg1:%@",NSStringFromSelector(_arg1));
    
    int _arg2;
    [invocation getArgument:&_arg2 atIndex:2];
    NSLog(@"arg2:%d",_arg2);
    
    id _arg3 = nil;
    [invocation getArgument:&_arg3 atIndex:3];
    NSLog(@"arg3:%@",_arg3);
    //---------------- 结束 查看参数 ----------------//

    
// NSLog(@"<%@:%@:%d>", NSStringFromClass([self class]), NSStringFromSelector(_cmd), __LINE__);

}


//MARK: - 测试函数
- (id)foo: (int) count
                  : (NSString* (^)(NSString *)) block {
    NSLog(@"personalMethod param1:%d, param2:%@",count,block(@"参数2"));
    return @"[真返回值]";
}



@end
复制代码

Reference:
Appple Doc:developer.apple.com/documentati…
Stackoverflow: stackoverflow.com/questions/5…

转载于:https://juejin.im/post/5be46cfe6fb9a049a5706546

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107204.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月20日 下午10:20
下一篇 2022年4月20日 下午10:20


相关推荐

  • pycharm如何缩进多行代码_pycharm如何运行选中代码

    pycharm如何缩进多行代码_pycharm如何运行选中代码方法一:在代码界面,点击鼠标右键,然后按住鼠标左键下拉选择就行了方法二:直接按下快捷键,alt+shift+insert,然后长按鼠标左键下拉即可进入多行编辑模式。…

    2025年8月7日
    4
  • rsync自动同步_文件实时同步

    rsync自动同步_文件实时同步文章目录一、rsync同步简介1.关于rsync2.rsync同步源(备份源)二、配置rsync备份源1.关闭防火墙2.查看rsync是否已安装,一般系统已默认安装rsync3.建立/etc/rsync.conf配置文件4.为备份账户创建数据文件5.保证所有用户对源目录/var/www/html都有读取权限6.启动rsync服务程序7.关闭rsync服务8.编写测试网页三、rsync命令基本用法1.基本格式2.常用选项四、配置发起端1.关闭防火墙2.查看rsync是否已安装,一般

    2022年10月13日
    5
  • 深度:一文看懂Linux内核!Linux内核架构和工作原理详解[通俗易懂]

    深度:一文看懂Linux内核!Linux内核架构和工作原理详解[通俗易懂]简介作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。目前支持模块的动态装卸(裁剪)。Linux内核就是基于这个策略实现的。Linux进程1.采用层次结构,每个进程都依赖于一个父进程。内核启动init程序作为第一个进程。该进程负责进一步的系统初始化操作。init进程是进程树的根,所有的进程都直接或者间接起源于该进程。virt/—-提供虚拟机技术的支…

    2022年7月23日
    37
  • seo推广_大学生梦想

    seo推广_大学生梦想最近这几天,我利用空闲时间去网上看到很多关于seoer的生存现状,尤为的感伤、因为自已也是一位爱好seo和利用闲于时间来学习seo的一个大学生屌丝,在学习的过程中,有辛酸和泪水、但也有快乐,感觉一年的seo学习下来,自认为还是有很多收获:不仅仅体现在知识见长了、对于seo操作更淡定了。而是认识了很多优秀的seo精英和seo前辈,他们每天都在放飞着自已的seo梦,作为一…

    2025年8月16日
    5
  • JavaScript split() 方法的第二个参数

    JavaScript split() 方法的第二个参数记录目的补充记录冷门知识点 记录日常工作使用 split 将字符串分割为数组 基本只会使用一个参数 即分割字符串的字符 如空字符 空格 逗号 特殊符号 amp 等等 查看官方 api 可以看到此方法拥有第二个参数 howmany 根据传入的 howmany 数值 返回切割后的长度为 howmany 的数组 使用场景比较少 但懂得多一点总归是好的 示例场景 只需要切割后的前 n 项 数据存在规律性 从某个分割点之后无效 获取有效数据 或是装 x 显摆 或是欺负小白 你

    2026年3月19日
    3
  • System.Runtime.InteropServices.COMException (0x8000401A): Retrieving the COM class factory for compo…

    System.Runtime.InteropServices.COMException (0x8000401A): Retrieving the COM class factory for compo…这个问题困扰了我很久,在网上找了很多资料都没用,最后找到解决方案:运行dcomcnfg打开组件服务,依次展开"组件服务"-&gt;"计算机"-&gt;"我的电脑"-&gt;"DCOM配置"找到"MicrosoftExcel应用程序"或"MicrosoftWord应用程序",右键打开属性对话框,点击"标识"选项卡,点&q

    2022年7月25日
    12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号