什么是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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • IDEA的下载和使用安装

    IDEA的下载和使用安装一.IDEA的下载IDEA下载地址:https://www.jetbrains.com/idea/download/#section=windowsIDEA分为两个版本:旗舰版(Ultimate)和社区版(Community)。旗舰版收费(限30天免费试用),社区版免费二.安装过程在这我们选择装旗舰版,社区版虽然免费,但是有些功能不全双击【ideaIU-2018.3.3.exe】安装文件:点击下一步(Next)选择好【文件的安装文件目录】,点击【Next】

  • 开心农场最新外挂助手下载[通俗易懂]

    开心农场最新外挂助手下载[通俗易懂] “开心农场”辅助外挂使用说明:1.解压缩文件(本文件完全解压后只有876KB不占用多余空间)2.打开 这个图标www.vi128.com3.这时,在右下角会出现这个标志 然后双击它4.出现一个新的笔记5.在笔记主框内写上好友的名字(如果不好找也可以再加上编号)和将要成熟的作物6.写好后点击 右上角这个蓝色小闹钟的图标 7…

  • linux下.tar.gz和.gz文件解压详解[通俗易懂]

    linux下.tar.gz和.gz文件解压详解[通俗易懂].tar.gz和.gz文件是两种不同的文件,需要区别对待,解压命令当然也不同咯,下面来分享一下他们各自的解压方法。1..tar.gz文件,这种文件是tar文件的压缩文件,可以使用tar命令进行解压。例如:解压:tarzxvfpythontab.tar.gztar-xjvfhttpd-2.4.4.tar.bz2解压文件到指定文件夹:tarxzvf…

  • 【架构设计】领域模型(概念模型) 、逻辑模型、物理模型、贫血模型、充血模型概念总结【待读与标记】[通俗易懂]

    本文选自:http://www.jianshu.com/p/fe45506ea358http://blog.csdn.net/zsy_gemini/article/details/9060105http://wuaner.iteye.com/blog/856450背景关于领域模型的知识应该是有两种,一种是来源于最初的传统软件开发过程,一种来源于领域驱动设计(DDD),这两者很容易混淆。1.领域模…

  • Scripting.FileSystemObject 的文件复制,删除,移动操作

    Scripting.FileSystemObject 的文件复制,删除,移动操作<%’创建一个FileSystemObject的事例SetMyFileObject=Server.CreateObject(“Scripting.FileSystemObject”)’创建一个要进行操作的文件SetMyFile=MyFileObject.CreateTextFile(“c:\test.txt”)MyFile.WriteLine(“Hello”)MyFile.Close’复…

  • 【组网】NAT类型为Udpblocked的解决方法

    【组网】NAT类型为Udpblocked的解决方法气死我了前段时间测了下NAT类型,发现是Udpblocked;从路由器检查到网关,发现电脑直连网关拨号也是Udpblocked;折磨了好几天,百思不得其解,但是用网好像也没什么异常,反倒是反复设置桥接成功把vlan搞乱了;今天临时试了下在公司测了下NAT类型,好家伙公司也是受阻;最后发现原来是测试工具自带的地址已经挂了。换个地址就好了也就是说我家里其实可能一直啥事没有,我一直在跟空气斗智斗勇有一说一默认的地址用了好多年了,怎么突然就歇逼了,百思不得其解…

发表回复

您的电子邮箱地址不会被公开。

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