oc消息转发:forwardInvocation、签名、参量个数、SEL 相关测试
结论1、签名的参量类型伪造不正确会导致崩溃。
结论二、签名个数不对可能会导致参量丢失。
结论三:在签名配置正确的情况下,系统会将函数调用的所有信息打包到NSInvocation准备转发;
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self performSelector:@selector(goooo:) withObject:@"dddd" afterDelay:0];
[self performSelector:@selector(exgoo) withObject:@"aa" withObject:@"bb"];
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
//NSMethodSignature *signature = [NSMethodSignature signatureWithObjCTypes:"v@:@"];
NSMethodSignature *signature = [NSMethodSignature signatureWithObjCTypes:"v@:f"];
return signature;
}
- (void)forwardInvocation:(NSInvocation *)anInvocation
{
__autoreleasing id returnObj;
[anInvocation getArgument:&returnObj atIndex:(NSInteger)2];
//dddd
//aa
NSLog(NSStringFromSelector(anInvocation.selector));
//exgoo::
//goooo:
NSLog(returnObj);
}
NSInvocation的调用有2个方法,target参数可以直接设置target属性或者设置为第一个参数,如果不设置则调用第二个方法将target传入
// 测试
// 构建对象 测试UILabel的setText:方法
UILabel *myObj = [UILabel new];
NSLog(@"invocation执行前myObj.text=%@", myObj.text);
// 构建方法签名返回类型void编码为v,对象UILabel类型编码为@,SEL编码为:,参数类型NSString编码为@
NSMethodSignature *myMethodSignature = [NSMethodSignature signatureWithObjCTypes:"v@:@"];
// 构建NSInvocation
NSInvocation *myInvocation = [NSInvocation invocationWithMethodSignature:myMethodSignature];
// 设置第1个参数
myInvocation.target = myObj;
// 设置第2个参数
myInvocation.selector = @selector(setText:);
// 设置第3个参数
NSString *newText = @"change new text";
[myInvocation setArgument:&newText atIndex:2];
[myInvocation retainArguments];
// 执行
[myInvocation invoke];
NSLog(@"invocation执行后myObj.text=%@", myObj.text);
作者:不上火喝纯净水
链接:https://www.jianshu.com/p/49151a79ac6a
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
oc消息转发:forwardInvocation、签名、参量个数、SEL 相关测试的更多相关文章
- iOS runtime探究(二): 从runtime開始深入理解OC消息转发机制
你要知道的runtime都在这里 转载请注明出处 http://blog.csdn.net/u014205968/article/details/67639289 本文主要解说runtime相关知识, ...
- oc消息转发机制本质
第一级转发:主体不变,动态添加对应函数: 第二级转发:函数不变,切换接收主体: 第三极转发:函数签名不变,主体和函数都有可能变化: 1.使用函数的动态添加技术: 2.使用的类似is-a swzzing ...
- runtime之消息转发
前言 在上一篇文章中我们初尝了runtime的黑魔法,可以在程序编译阶段就获取到成员变量的名字,特性以及动态的给对象增加属性等等,在接下来中我们进一步了解OC的消息发送机制.如果之前没接触过runti ...
- OC:浅析Runtime中消息转发机制
一.介绍 OC是一门动态性语言,其实现的本质是利用runtime机制.在runtime中,对象调用方法,其实就是给对象发送一个消息,也即objc_msgSend().在这个消息发送的过程中,系统会进行 ...
- 使用methodSignatureForSelector与forwardInvocation实现消息转发 (转)
转自:http://blog.sina.com.cn/s/blog_8c87ba3b0102v006.html 在给程序添加消息转发功能以前,必须覆盖两个方法,即methodSignatureForS ...
- iOS开发·runtime原理与实践: 消息转发篇(Message Forwarding) (消息机制,方法未实现+API不兼容奔溃,模拟多继承)...
本文Demo传送门: MessageForwardingDemo 摘要:编程,只了解原理不行,必须实战才能知道应用场景.本系列尝试阐述runtime相关理论的同时介绍一些实战场景,而本文则是本系列的消 ...
- Runtime-消息发送和消息转发
消息发送 消息发送举例:下面这个OC代码 [person read:book]; 会被编译成: objc_msgSend(person, @selector(read:), book); objc_m ...
- iOS开发-消息转发
消息转发是OC运行时比较重要的特性,Objective-C运行时的主要的任务是负责消息分发,我们在开发中"unrecognized selector sent to instance xx& ...
- Runtime 运行时之一:消息转发
解释一 上一篇文章咱们提到了Runtime的消息传递机制,主要围绕三个C语言API来展开进行的.这篇文章我将从另外三个方法来描述Runtime中另一个特性:消息转发机制. 一.消息转发机制 当向某个对 ...
随机推荐
- win7下使用IIS服务器及自定义服务器端包含模块(SSI)步骤
配置完过段时间就容易忘记,特此记录. 1.开启IIS服务器. 默认没有安装,需要先安装. 打开控制面板–> 打开“程序和功能”–> 左侧选择“启用或关闭windows功能”–> 找到 ...
- java SE 入门之输入输出(第四篇)
在第一篇,八大基本类型的时候,我就介绍了输出,当然,这些输出都是简单的,后续写到流的时候,在细化输入输出. 现在只要求看懂输入输出.输入其实就是接受键盘的输入. public class Hello ...
- Ajax 学习(一)
此篇为学习笔记 概述 Ajax(Asynchronous Javascrpt And Xml)是一种运用于浏览器的技术,它可以在浏览器与服务器之间使用异步通信机制进行数据通信,从而允许浏览器向服务器获 ...
- Android - Builder模式
https://github.com/simple-android-framework-exchange/android_design_patterns_analysis/tree/master/bu ...
- Algorithm——Add Two Numbers(补上周)
一.question You are given two non-empty linked lists representing two non-negative integers. The digi ...
- 简单的PHP的任务队列
文章太长,不作过多介绍,反正,文章的头部就说明了大概的意思...原文如下:写了一个简单的队列任务处理.多进程任务,异步任务可能会用到这个(主要是命令行应用)比如,任务的某个一个环节速度十分不稳定,可能 ...
- 在vue-cli中使用layer中的layData日期组件
有朋友问我怎么在vue-cli项目中使用layui中的layData组件,有时间从网上查了下写下篇文章. 1.首先去layData官网把文件包下载下来,解压出来的laydate文件夹整个放在vue-c ...
- 612.1.004 ALGS4 | Elementary Sorts - 基础排序算法
sublime编辑器写代码,命令行编译 减少对ide的依赖//可以提示缺少什么依赖import 所有示例代码动手敲一遍 Graham's Scan是经典的计算几何算法 shffule 与 map-re ...
- 树莓派发射FM波——搭建私人小电台
树莓派的应用十分广泛,有很多奇思妙想的应用非常有趣,在这里我们想实现一个小电台的功能,但是在这里需要说明,私人架设电台是违法行为,所以本案只作为自我娱乐所用,不能发射大功率的信号干扰正常的FM频段. ...
- redis 数据淘汰策略与配置
redis 数据淘汰策略 volatile-lru:从已设置过期的数据集中挑选最近最少使用的淘汰volatile-ttr:从已设置过期的数据集中挑选将要过期的数据淘汰volatile-random:从 ...