首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ios OC 消息转发机制

ios OC 消息转发机制

原创
作者头像
conanma
修改于 2021-06-08 10:14:50
修改于 2021-06-08 10:14:50
89200
代码可运行
举报
文章被收录于专栏:正则正则
运行总次数:0
代码可运行

一 概述

     在编译期向类发送了其无法解读的的消息并不会报错,因为在运行期可以继续让类中添加方法,所有编译器在编译时还无法确知类中到底会不会有某个方法实现,当对象接收到无法解读的消息后,就会启动 消息转发 机制,程序员可经由此过程告诉对象应该如何处理未知消息。

在程序运行中,有时会以下异常信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Class function_name ] unrecognized selector sent to instanc

上段信息就是发送一个未识别的消息给实例,类定义但对象未实现function_name 方法

二 消息转发的两大阶段

    第一阶段先征询接受者所属的类,看其是否能动态添加方法,以处理当前“未知的选择子”,叫做“动态方法解析”。

    第二阶段涉及“完整的消息转发机制”,如果运行期系统已经把第一阶段执行完了,那么接受者自己就无法再以动态新增方法的手段来响应包含该选择子的消息了。此时,运行期系统会请求接受者以其他手段来处理与消息相关的调用方法。这又细分为两小阶段。首先,请接受者看看有没有其他对象能处理这条信息。若有,则运行期系统会把消息转给那个对象,于是消息转发过程结束。若没有“备援的接受者”,则启动完成的消息转发机制,运行期系统会把与消息有关的细节全部封装到NSInvocation对象中,让接受者最后一次设法解决当前还未处理的这条消息

2.1动态方法解析

    对象接收到无法解读的消息后,首先将调用所属类的下列类方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+(BOOL)resolveInstanceMethod:(SEL)selector

该方法的参数就是未知的选择子,返回类型为Boolean,表示类是否能新增一个实例方法用以处理此选择子。在继续往下执行转换机制之前,本类可用新增处理此选择子的方法,假如尚未实现的方法不是实例方法而是类方法,那么运行期系统就会调用另外一个方法,该方法与“resolveInstanceMethod:”类似,叫做”resolveClassMethod:” 。

    使用这种办法的前提是:相关方法的代码实现已经写好,只等着运行的时候动态插在类里面就可以了。此方案常用来实现@dynamic 属性,比如要访问CoreData框架中NSManagedObjects对象的属性时就可用这么做,因为实现这些属性所需要的存取方法在编译器就能确定

2.2.1 备援接受者

    备援接受者为处理未知的选择子提供第二次机会,嫩故能把这条消息转给其他接受者来处理。该步骤对应的处理方法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-(id)forwardingTargetForSelector:(SEL)selector

方法参数代码未知的选择子,若当前接受者能找到备援对象,则将其返回,若找不到,就返回nil。通过次方案,我们可以用“组合”来模拟“多重继承”的某些特性。在一个对象内部,可能还有一系列其他对象,该对象可经由此方法将能够处理某选择子的相关内部对象返回,从外界看来,好像是该对象亲自处理这些消息。若是想在发送给备援接受者之前先修改消息内容,那就通过完整消息转发机制来做。

2.2.2 完整的消息转发

    如果转发算法到了这一步,那么唯一能做的就是启用完整的消息转发机制,首先创建NSInvocation对象,把尚未处理的那条消息有关的全部细节都封于其中。此对象包含选择子,目标及参数。在触发NSInvocation对象时,“消息派发系统”将会把消息指派给目标对象。

此步骤会调用下列方法来转发消息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-(void)forwardInvocation:(NSInvocation *)invocation

    该方法实现简单,只需要改变调用目标,使消息在新目标上得以调用即可。然而这样实现出来的方法与“备援接受者”方案所实现的方法等效,所有很少有人采用这么简单的实现方式。比较有用的实现方式为:在触发消息前,先以某种方式改变消息内容,比如追加另外一个参数,或是改变选择子。

    实现该方法时,若发现某调用操作不应由本类处理,则需要调用超类的同名方法。这样集成体系中的某个类都有机会处理此方法调用,直到NSObject,继而调用”doesNotRecognizeSelector:”以抛出异常,此异常表明选择子最终未能得到处理。

三 消息转发全流程

    接受者在每一步中均有机会处理信息。步骤越往后,处理消息的代价就越大,最好能在第一部就能处理完,这样,运行期系统就可以将方法缓存起来,如果这个类的实例稍后收到同名选择子,就武器启动消息转发流程。若想在第三部把消息转给备援接受者,还不如提前到第二步,因为第三步只是修改了调用目标,这项改动放在第二步执行更为简单,而且不用创建并处理完整的NSInvocation

四 总结

  • 若对象无法响应某个选择子,则进入消息转发机制
  • 通过运行期的 动态方法解析 功能,可以在需要用到某个方法时再将其加入类中
  • 对象可以把其无法解读的某些选择子转交给其他对象来处理(备援接受者\完整的消息转发)
  • 经过上述两步之后,如果还是没办法处理选择子,那就启动完整的消息转发机制

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
硬核科普:什么是拓扑?
这个问题很难回答,每次我都会给出略有不同的答案,但是答案总是不那么令人满意。如果你曾经在网上搜索过拓扑,你肯定会遇到将甜甜圈变成咖啡杯的动画,同样,我给出的答案也都与此相关:为什么甜甜圈跟咖啡杯在拓扑结构上是一样的,立方体和球体拓扑上也是一样的。但是这样的答案并不能真正解释真实的拓扑是什么,拓扑怎么应用以及其真正的价值是什么。
magic2728
2020/09/15
1.6K0
代数拓扑\集合拓扑\代数拓扑\拓扑关系\拓扑结构_笔记
拓扑是研究几何图形或空间在连续改变形状后还能保持不变的一些性质的一个学科。它只考虑物体间的位置关系而不考虑它们的形状和大小。
周陆军
2019/12/10
2.1K0
从STL文件到网格拓扑
STL文件是网格文件的一种格式,分为二进制和文本两种类型。具体来讲,它定义了一群三角面片,比如下面是一个文本的STL示例:
NT4.4
2019/10/25
1.1K0
从STL文件到网格拓扑
地球是个球体,那宇宙是个啥?
在我们的心目中,宇宙似乎永远存在。但是利用几何学,我们可以探索各种三维形状,为“普通”无限空间提供选择。公众号今天为大家带来一篇别具一格的文章!
量化投资与机器学习微信公众号
2020/04/13
1.1K0
陈陟原:数据降维与可视化| AI 研习社第 53 期猿桌会
相信大多数人都已经接触过数据可视化——Excel 随便画一张表就是了。众所周知,二维数据可视化很容易,条形图、饼状图等等,我们在初中就已经学过了。那么三维数据呢?可能有些接触到音频产品的朋友会说瀑布图,很好。而 N 维数据呢?物理学告诉我们:低维空间只能观察到高维空间在本维度的投影。既然我们本身的维度无法增加,那么就只能想办法把数据的维度降低了。
AI科技评论
2018/09/21
6120
陈陟原:数据降维与可视化| AI 研习社第 53 期猿桌会
拓扑数据分析在机器学习中的应用
作者:曾凤 责任编辑:周建丁(zhoujd@csdn.net) 本文为《程序员》原创文章,未经允许不得转载,更多精彩文章请订阅2016年《程序员》http://dingyue.programmer.com.cn 机器学习(ML)算法涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。它是人工智能的核心,是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域,它主要使用归纳、综合而不是演绎。而“拓扑数据分析”作为机器学习的一种形式,已经开始被广泛应用。本文简要介绍“拓扑数据分析”在机器学习中
用户1737318
2018/06/06
2.1K3
用 Mathematica 玩转环面
环面及其变体 要玩转环面,先要构造出环面,然后才可以谈其它。本节将介绍如何从环面出发,用数学公式让它发生各种形变,以及如何变化参数,生成动画。 01 构造环面 我们都很熟悉圆的参数方程,比如对一个半径
WolframChina
2018/05/31
2.9K3
三维之外的更高维度,数学家发现了无限可能的黑洞形状
选自quantamagazine 作者:Steve Nadis 机器之心编译 编辑:赵阳 黑洞可能不是球形的?我们的宇宙也可能不是四维的?近日,量子杂志刊发了来自石溪分校研究者们的最新成果,我们的宇宙可能存在更多的维度! 在三维空间中,黑洞的表面一定是球体。但是一项新的研究结果表明,在更高的维度中,可能其形状存在无限多的可能。 如果我们能发现非球形黑洞,这将表明我们的宇宙具有超过三个维度的空间。 宇宙似乎偏爱圆形的东西。行星和恒星往往是球体,因为重力将气体和尘埃云拉向质心。这同样适用于黑洞,或者更准确地说
机器之心
2023/03/29
6270
三维之外的更高维度,数学家发现了无限可能的黑洞形状
穹彻智能-上交大最新Nature子刊速递:解析深度学习驱动的视触觉动态重建方案
在人形机器人操作领域,有一个极具价值的问题:鉴于操作数据在人形操作技能学习中的重要性,如何有效地从现实世界中获取操作数据的完整状态?
机器之心
2025/02/14
1260
穹彻智能-上交大最新Nature子刊速递:解析深度学习驱动的视触觉动态重建方案
对称、群论与魔术(四)——空白扑克卡片的对称性研究
在前面的文章中,我们从描述对称的困难到提出对称群的概念,以及拓展到群这一数学结构的多种应用,最后有回到几何对称的本源上。相关内容请戳:
magic2728
2022/05/18
1.2K0
对称、群论与魔术(四)——空白扑克卡片的对称性研究
教机器人捏橡皮泥?MIT、IBM, UCSD等联合发布软体操作数据集PlasticineLab
机器之心专栏 作者:MIT CSAIL 「PlasticineLab」的提出,或为软体动力学领域的众多研究提供了新思路。 虚拟环境(ALE、MuJoCo、OpenAI Gym)极大地促进了在智能体控制和规划方面学习算法的发展和评估,然而现有的虚拟环境通常只涉及刚体动力学。尽管软体动力学在多个研究领域有着广泛的应用(例如,医疗护理中模拟虚拟手术、计算机图形学中模拟人形角色、机器人技术中开发仿生制动器、材料科学中分析断裂和撕裂),关于构建标准软体环境和基准的研究却很少。 与刚体动力学相比,软体动力学的模拟、控
机器之心
2023/03/29
7050
教机器人捏橡皮泥?MIT、IBM, UCSD等联合发布软体操作数据集PlasticineLab
CAD2007操作教程下
图层相当于图纸绘图中使用的重叠图纸,创建和命令图层,并为这些图层指定通用特性。通过将对象分类放到各自的图层中,可以快速有效地控制对象的显示以及其进行更改。(例如墙体或标注)
用户7505898
2020/09/02
9.4K0
CGAL功能大纲
Computational Geometry Algorithms Library,CGAL,计算几何算法库。使用C++语言编写的,提供高效、可控的算法库。广泛应用于计算几何相关领域,如地理信息系统、计算机图形学、计算机辅助设计、信息可视化系统、生物医学等。
用户3519280
2023/07/08
1.9K0
从「生态光学」取经,伯克利曹颖提出解决物体遮挡问题方案,登PNAS
「向传统视觉研究寻求破局之法」成为了近年来计算机视觉领域的一大趋势。将传统视觉技术与深度学习方法结合有望构建更为鲁邦的下一代视觉模型。 近日,著名计算机视觉、神经科学学者曹颖在美国科学院院刊 PNAS 上发表研究论文,基于 J.J.Gibson 的「生态光学」和微分拓扑学提出了一种新的图像分割与目标跟踪框架,对计算机视觉和生物视觉研究具有巨大的启发意义。 作者丨曹颖、Thomas Tsao 编译丨OGAI 编辑丨陈彩娴 我们所生活的世界由物体、地面和天空组成。视觉感知需要解决两个基本的问题: (1)将视觉输
AI科技评论
2023/04/12
6970
从「生态光学」取经,伯克利曹颖提出解决物体遮挡问题方案,登PNAS
Blender 甜甜圈制作
- `吸附` 选为 **面** 选中 **投影到自身** 和 **项目的独立元素**
用户9786230
2022/05/29
1.4K0
Blender 甜甜圈制作
CAD 初级教程
l 认识AutoCAD的应用领域,让学生了解软件的专业特点及在校的优势,认识本专业在国内的发展历程及毕业后的前景。
用户7505898
2020/09/16
6.6K0
CAD 初级教程
CAM选择填空
A 显示器       B 数字化仪     C 打印机        D 绘图仪
用户7505898
2020/09/20
1.7K0
CAM选择填空
SIGGRAPH 2025 | CLR-Wire:曲线框可生成?可交互?深大VCC带你见证魔法
深圳大学黄惠团队独立推出 CLR-Wire:连续潜空间驱动的三维曲线框生成方法,首次实现了将复杂的三维曲线框结构统一编码到连续的潜空间中,解决了传统方法难以同时有效捕捉线框几何和拓扑信息的难题。这一创新技术能够实现复杂三维结构的高效生成与平滑插值,在工业设计、三维重建及内容创作等领域具有广泛的实际应用前景。第一作者为深圳大学可视计算研究中心 (VCC) 博士研究生马雪奇,合作者刘奕林、高天龙、黄期瑞均为 VCC 研究生。CLR-Wire 相关代码已全面开源,欢迎大家试用和建议。
机器之心
2025/06/10
550
SIGGRAPH 2025 | CLR-Wire:曲线框可生成?可交互?深大VCC带你见证魔法
GIS拓扑讲解点线面几何体的拓扑关系判断及运算分析_turf案例
Turf.js是JavaScript  空间分析库,由Mapbox 提供,Turf 实现了
周陆军博客
2023/04/09
2.9K0
ICLR 2022 Spotlight|让AI学会捏橡皮泥飞机
机器之心专栏 作者:李思哲、黄志翱、淦创等 来自于mit-ibm 机器人研究院院长淦创团队的工作提出了一种接触点发现算法 CPDeform,将基于最优传输的接触点发现算法集成到可微物理求解器中,克服了初始接触点次优或接触点切换时的局部极小值问题。 最近的研究表明,可微分物理是解决软体控制任务的强大工具。然而,当末端执行器的初始接触点次优或在多阶段任务中执行接触点切换时,可微物理求解器经常会卡住并导致局部最小值。 为了解决该问题,来自于mit-ibm 机器人研究院院长淦创团队的研究者提出了一种接触点发现方法
机器之心
2022/05/05
7760
ICLR 2022 Spotlight|让AI学会捏橡皮泥飞机
推荐阅读
相关推荐
硬核科普:什么是拓扑?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验