首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

消息转发不起作用(Objective-C)

消息转发是Objective-C语言中的一种机制,用于处理对象接收到无法识别的消息时的行为。当一个对象接收到一个无法识别的消息时,Objective-C运行时会尝试将消息转发给其他对象来处理。

消息转发机制主要分为三个阶段:动态方法解析、备用接收者和完整转发。

  1. 动态方法解析:在这个阶段,运行时会调用对象的resolveInstanceMethod:resolveClassMethod:方法,给开发者一个机会来动态添加方法实现。开发者可以在这个方法中使用class_addMethod函数来动态添加方法。
  2. 备用接收者:如果在动态方法解析阶段没有成功添加方法实现,运行时会调用对象的forwardingTargetForSelector:方法,尝试将消息转发给其他对象来处理。开发者可以在这个方法中返回一个备用的接收者对象,该对象将接收到无法识别的消息。
  3. 完整转发:如果备用接收者也无法处理消息,运行时会调用对象的methodSignatureForSelector:方法和forwardInvocation:方法。methodSignatureForSelector:方法返回一个方法签名,描述了无法识别的消息的参数类型和返回值类型。forwardInvocation:方法接收一个NSInvocation对象,开发者可以在这个方法中修改NSInvocation对象的目标对象和方法选择器,从而将消息转发给其他对象。

消息转发机制的优势在于它提供了一种动态处理无法识别消息的方式,使得开发者可以在运行时动态添加方法实现或将消息转发给其他对象来处理。这种机制在实现一些动态特性、消息转发代理等方面非常有用。

消息转发机制在以下场景中可以发挥作用:

  • 动态方法解析:当需要在运行时动态添加方法实现时,可以使用动态方法解析阶段来实现。
  • 备用接收者:当一个对象无法处理某个消息,但其他对象可以处理时,可以使用备用接收者来将消息转发给其他对象。
  • 完整转发:当需要在运行时动态修改消息的目标对象和方法选择器时,可以使用完整转发阶段来实现。

腾讯云提供了一系列与云计算相关的产品,以下是一些推荐的产品和产品介绍链接地址:

  • 云服务器(CVM):提供可扩展的计算能力,支持多种操作系统。产品介绍链接
  • 云数据库 MySQL 版(CDB):提供高可用、可扩展的关系型数据库服务。产品介绍链接
  • 云存储(COS):提供安全可靠的对象存储服务,适用于存储和处理大规模的非结构化数据。产品介绍链接
  • 人工智能平台(AI Lab):提供丰富的人工智能算法和模型,帮助开发者快速构建和部署人工智能应用。产品介绍链接
  • 物联网开发平台(IoT Explorer):提供全面的物联网解决方案,帮助开发者连接、管理和控制物联网设备。产品介绍链接

请注意,以上推荐的产品和链接仅供参考,具体选择应根据实际需求和情况进行。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

消息转发

同时还有一套完整的异常消息转发机制,在消息异常时,提供完整的转发链来供用户进行异常补救.在几乎所有的方法调用中,我们都会确保相关方法得到了实现了,但总是会有漏网之鱼: 尝试使用字符串映射对应的方法,来进行动态调用时出现异常....在OC中的消息转发机制分为以下时机: 在这部分分析中,需要具备以下知识: 方法签名 运行时动态添加/交换方法实现 动态注册新类 动态方法解析 这是消息转发的第一步.在这一步骤中,运行时希望能够获得一个方法实现来正确处理这个异常的消息...,就是类方法不会的消息不能到这一步,只有实例对象的方法才可以转发到这个时机....,在这个时机里,你可以同时将消息转发给多个对象进行处理....消息转发机制的应用 了解了消息转发的实现之后,我们来探索一下消息转发机制的应用. 2.1 避免程序异常闪退,定位异常位置 无论你多么牛逼,实现中都会有一些莫名其妙的异常,而针对不能识别的这类异常,就可以利用消息转发机制在抛出异常之前对异常的方法进行转发处理

1.7K20
  • 神经病院Objective-C Runtime住院第二天—消息发送与转发

    在receiver拿到对应的selector之后,如果自己无法执行这个方法,那么该条消息要被转发。或者临时动态的添加方法实现。如果转发到最后依旧没法处理,程序就会崩溃。...Objective-C 消息发送与转发机制原理 Hmmm, What’s that Selector? 还是回到消息转发上面来。...为接下来的完整的消息转发生成一个 NSMethodSignature对象。...接下来未识别的方法崩溃之前,系统会做一次完整的消息转发。 我们只需要重写下面这个方法,就可以自定义我们自己的转发逻辑了。...这个例子中我们会利用runtime消息转发机制创建一个动态代理。利用这个动态代理来转发消息。这里我们会用到两个基类的另外一个神秘的类,NSProxy。

    26410

    神经病院Objective-C Runtime住院第二天—消息发送与转发

    在receiver拿到对应的selector之后,如果自己无法执行这个方法,那么该条消息要被转发。或者临时动态的添加方法实现。如果转发到最后依旧没法处理,程序就会崩溃。...Objective-C 消息发送与转发机制原理 Hmmm, What’s that Selector? 还是回到消息转发上面来。...为接下来的完整的消息转发生成一个 NSMethodSignature对象。...接下来未识别的方法崩溃之前,系统会做一次完整的消息转发。 我们只需要重写下面这个方法,就可以自定义我们自己的转发逻辑了。...这个例子中我们会利用runtime消息转发机制创建一个动态代理。利用这个动态代理来转发消息。这里我们会用到两个基类的另外一个神秘的类,NSProxy。

    78130

    Runtime消息转发机制

    iOS 消息发送机制 首先要知道Runtime的时候类的结构: struct objc_class { Class_Nonnull isa OBJC_ISA_AVAILABILITY;...那么问题来了,如果我们给一个对象发送消息的时候(即调用该对象的方法),这个方法没在这个对象的MethodList中找到,那么会怎么样?...调用forwardingTargetForSelector:方法,尝试找到一个能响应该消息的对象。如果获取到,则直接把消息转发给它,返回非 nil 对象。否则返回 nil ,继续下面的动作。...iOS如何消息转发 1.首先在类方法列表中没有找到方法,那么系统会调用resolveInstanceMethod或者resolveClassMethod,让你动态添加方法实现。.../**  *  是自己新建方法签名,再在forwardInvocation中用你要转发的那个对象调用这个对应的签名,这样也实现了消息转发

    77220

    RunTime 之消息处理与消息转发

    前言 有关Runtime的知识总结,我本来想集中写成一篇文章的,但是最后发现实在是太长,而且不利于阅读,最后分成了如下几篇: RunTime 之使用前须知 RunTime 之常规操作 RunTime 之消息处理与消息转发...RunTime 之Method Swizzling RunTime 之其他实践运用 ---- OC方法的调用其实是消息的发送, 消息的发送其实是C语言函数的调用 在Runtime中不得不提的就是OC的消息处理和消息转发机制...如果在父类中的方法列表中找到了相应方法的实现,那么就执行, 否则就执行消息处理与消息转发相关的方法。 总结一下流程图就是如下: ?...该方法会返回一个类的对象,这个类的对象有SEL对应的实现,当调用这个找不到的方法时,就会被转发到SecondClass中去进行处理。这也就是所谓的消息转发。...如果不将消息转发给其他类的对象,那么就只能自己进行处理了、或者崩溃。

    70720

    (4)OC中消息消息转发-02

    所以我们可以得出结论,程序向某个对象发送没实现的消息,在程序崩溃之前会给我们三次机会弥补,接下来,我们用代码来验证第一个方法resolveInstanceMethod: resolveInstanceMethod...forwardingTargetForSelector: 如果上面的方法+ (BOOL)resolveInstanceMethod:(SEL)sel返回NO,接着就会进行消息转发,执行forwardingTargetForSelector...事实证明,如果实现这个方法,程序在运行时调用的时候只要不返回nil或者self,系统会将该消息转发给别的对象来处理,在别的对象当中,甚至不需要再头文件将方法名暴露出来,系统会找到要转发的类,自动查找。...我怀疑:如果程序没有通过前面三种方法找到方法的实现,程序会动态调用一次- (Class)class方法,查看我们是否改变了对象所指向的类,如果发现我们改变了,程序就会通过消息转发forwardInvocation

    44820

    对象、消息、运行期--12:runtime消息转发

    消息转发 消息转发分为俩大阶段 动态方法解析 完整的消息转发机制 消息转发全流程: 若对象无法响应某个选择器,则进入消息转发流程 2.通过运行期间的动态方法解析,可以再需要用到某个方法时再将其加入类中...3.对象可以把其无法解读的某些选择器转交给其他对象处理 4.经过上述两步,如果还是不能处理选择器,那就启动完整的消息转发机制 消息转发全流程.png 动态方法解析(动态添加方法) 当一个实例对象调用一个不存在的方法...(IMP)sayHello, "v@:"); return YES; } return [super resolveInstanceMethod:sel]; } 完整的消息转发机制...第二步:第一步执行完,如果没有新增方法,运行期系统会把这个消息转给其他接收者处理,系统会调用这个方法 - (id)forwardingTargetForSelector:(SEL)aSelector...此时,我们需要找一个与Phone相关连的类去处理这个消息,如果这个相关联的对象可以处理这个消息,则返回这个对象,若不能则返回nil。

    17210

    (3)OC中消息消息转发-01

    ,上面给对象发消息的代码可以简写成: objc_msgSend(p, @selector(eat)); 上面方法调用的意思就是:给p对象发送名为eat的消息,所以OC中给对象发消息本质上都是调用objc_msgSend...接下来就会用到消息转发,调用这个方法_objc_msgForward_impcache /********************************************************...从严格意义上来讲_class_resolveInstanceMethod和_class_resolveClassMethod并不是由__objc_msgForward_impcache触发的,并不能算作消息转发的后续步骤...,消息转发后,该对象如果再次遇到同名消息是,会直接从缓存中找到对应的IMP,即_objc_msgForward_impcache,此时我们需要重写- (id)forwardingTargetForSelector...,用这个方法非常有用,因为它比常规的转发快一个数量级,他转发的目标是捕获NSInvocation。

    43540

    iOS RunTime之四:消息转发

    消息发送和消息转发流程可以概括为: 消息发送是 Runtime 通过 selector 快速查找 IMP 的过程,有了函数指针就可以执行对应的方法实现; 消息转发是在查找 IMP 失败后执行一系列转发流程的慢速通道...动态方法解析会在消息转发机制浸入前执行。...接下来,我们要通过一个小例子来简单、通俗的理解一下什么是消息转发以及如何消息转发,希望看完这篇文章时大家会彻底的明白OC的消息。 上一篇消息发送,我们知道Objective-C语言动态语言。...Paste_Image.png 通过运行程序,可以看出在语言中Objective-C只声明并且没有实现方法编译器依然能够通过,但是运行期间则会因为获取不到实际执行的方法而抛出异常。 消息转发验证 ?...以上就是消息转发,如果有觉得上述我讲的不对的地方欢迎指出,大家多多交流沟通。

    76331

    消息转发流程的源码探究

    注:在阅读本文之前,请先阅读我之前写的如下三篇文章: Runtime——消息转发流程 Effective Objective-C 2.0——理解消息转发机制 Runtime再理解 在上篇文章方法的查找流程...消息的快速转发流程 如果在动态方法决议中没有做任何的处理,那么就会走到这里的快速消息转发流程。...其返回参数是一个对象,如果这个对象非nil、非self的话,系统会将运行的消息转发给这个对象执行。否则,会进入下面的消息慢速转发流程。...消息的慢速转发流程 当对象接收到某个消息之后,首先会去查找是否有该实现函数,如果有,那么就直接调用;如果没有,则进入消息转发流程。...消息快速转发,也就是将消息转发给别的对象,如果我不将消息转发给别的对象,那么就会进入到现在所讲的慢速消息转发流程。

    57030

    iOS底层原理之消息转发

    在动态决议之后,通过日志辅助功能认识到forwardingTargetForSelector和 methodSignatureForSelector方法,也就是消息发送的最后一个流程消息转发。...准备工作 objc4-818.2 源码 CF 源码 反汇编工具Hopper和ida 消息转发 消息发送在经过动态方法决议仍然没有查找到正真的方法实现,此时动态方法决议抛出imp = forward_imp...进入消息转发流程。...如果不给指定的类实现,快速转发也不行了,系统没有底线的给你进行慢速转发,就离谱 慢速转发 慢速转发methodSignatureForSelector也是消息查找的最后一个流程。...所以不处理也不会崩溃 消息换发总结 快速转发:通过forwardingTargetForSelector实现,如果此时有指定的对象去接收这个消息,就会走之指定对象的查找流程,如果返回是nil,进入慢速转发流程

    84310

    iOS进阶之消息转发机制

    在本例中,消息转发过程以应用程序崩溃而告终,不过,开发者在编写自己的类时,可于转发过程中设置挂钩,用以执行预定的逻辑,而不使应用程序崩溃。 消息转发分为两大阶段。...若有,则运行期系统会把消息转给那个对象,于是消息转发过程结束,一切如常。...请注意,我们无法操作经由这一步所转发消息。若是想在发送给备援接收者之前先修改消息内容,那就得通过完整的消息转发机制来做了。...完整的消息转发 如果转发算法已经来到这一步的话,那么唯一能做的就是启用完整的消息转发机制了。首先创建NSInvocation对象,把与尚未处理的那条消息有关的全部细节都封于其中。...消息转发全流程 ? 消息转发机制步骤 接收者在每一步中均有机会处理消息。步骤越往后,处理消息的代价就越大。最好能够在第一步就处理完,这样的话,运行期系统就可以将此方法缓存起来了。

    84060

    更改 TUIKit 实现消息转发的功能

    更改 TUIKit 实现消息转发的功能 前提背景: 当前 IMSDK 5.1.21 版本的 TUIkit 还不支持消息转发的功能(后续很快将提供)....这个示例可以作为一个转发消息参考 实现原理一句话介绍: 拿到当前消息的信息, 转发的时候重新构建一条新的消息发送出去 step1: 添加长按菜单项目 长按消息出现转发选项, 可以在 tuikit 的 -..., 对想要提供转发消息类型添加该选项, 例如这里的文本消息 添加后效果如下: 106442822-b47f5000-64b6-11eb-9b22-81ca85c4a4e3.png step2: 响应转发点击...在弹出的通讯录界面 ShareContactViewController 处理转发, 也就是拿到数据自己创建一条消息发出去 通讯录点击好友的响应方法是: onSelectFriend 在 onSelectFriend...中拿到数据发送, 示例为文字和图片消息 图片消息需要拿到当前的图片消息, 获取当前的 localPath, 再构造一个图片消息, 调发送接口发送(视频文件消息同理) - (void)onSelectFriend

    91911
    领券