当前位置:首页 > 科技  > 软件

OC消息发送和转发机制原理

来源: 责编: 时间:2023-10-13 14:33:36 184观看
导读Objective-C(OC)是一门面向对象的编程语言,它在消息传递和方法调用方面具有独特的机制。在OC中,对象通过消息来调用方法,而不是像传统的编程语言那样直接调用函数。本文将深入探讨OC的消息发送和转发机制原理,包括其基本概

Objective-C(OC)是一门面向对象的编程语言,它在消息传递和方法调用方面具有独特的机制。在OC中,对象通过消息来调用方法,而不是像传统的编程语言那样直接调用函数。本文将深入探讨OC的消息发送和转发机制原理,包括其基本概念、实现过程、代码示例以及实际应用场景。CXR28资讯网——每日最新资讯28at.com

CXR28资讯网——每日最新资讯28at.com

第一步:什么是消息发送和转发机制?

在Objective-C中,对象之间的通信是通过消息传递来实现的。当一个对象想要调用另一个对象的方法时,它会发送一个消息,然后由接收消息的对象来响应这个消息。这种方式与传统的函数调用不同,使得OC具有更高的动态性和灵活性。CXR28资讯网——每日最新资讯28at.com

消息发送和转发机制分为三个阶段:CXR28资讯网——每日最新资讯28at.com

  • 消息发送(Message Sending): 当一个对象收到一个消息时,它首先会在自己的方法列表中查找是否有与消息对应的方法。如果找到了,就会执行该方法;如果找不到,就会进入下一阶段。
  • 消息转发(Message Forwarding): 如果对象无法找到与消息对应的方法,它将进入消息转发过程。在这个阶段,对象有机会将消息转发给其他对象。
  • 未知消息处理(Handling Unknown Messages): 如果经过消息转发仍未找到合适的方法,系统将调用-doesNotRecognizeSelector:方法,该方法默认会引发异常,但也可以由开发者进行重写以执行其他操作。

第二步:消息发送的原理

消息发送是OC的核心机制之一,它使得方法的调用更为动态和灵活。消息发送的原理可以概括为以下几个步骤:CXR28资讯网——每日最新资讯28at.com

  • 创建消息: 当一个对象想要调用方法时,它会创建一个消息,包括消息的接收者、方法名(选择器)以及方法的参数。
  • 查找方法: 对象会在自己的方法列表(方法分发表)中查找是否存在与消息对应的方法。方法分发表是一个映射,将选择器与方法的实现关联起来。
  • 调用方法: 如果找到了与消息对应的方法,对象将直接调用该方法并执行。如果找不到,消息将进入消息转发阶段。

第三步:消息转发的原理

当一个对象无法找到与消息对应的方法时,它会进入消息转发过程。消息转发的原理可以概括为以下几个步骤:CXR28资讯网——每日最新资讯28at.com

  • 消息转发的开始: 对象收到无法处理的消息后,会调用-forwardingTargetForSelector:方法,该方法允许对象将消息转发给其他对象。如果返回一个有效的对象,则消息将被转发给该对象。
  • 备用接收者: 如果-forwardingTargetForSelector:方法返回nil,对象会继续查找是否存在备用接收者(Alternate Receiver),这通常是另一个对象。备用接收者可以通过覆盖+ (id)forwardingTargetForSelector:(SEL)aSelector类方法来指定。
  • 动态方法解析: 如果没有备用接收者或备用接收者也无法处理消息,对象将调用+resolveInstanceMethod:或+resolveClassMethod:方法来动态添加方法。这允许开发者在运行时为对象添加新方法。
  • 完整的消息转发: 如果前面的步骤都失败,对象将调用-forwardInvocation:方法,将消息以NSInvocation对象的形式传递给该方法。在-forwardInvocation:方法中,开发者可以手动处理消息的转发,包括将消息发送给其他对象或执行其他操作。

第四步:消息发送和转发的代码示例

让我们通过一个简单的代码示例来演示消息发送和转发的过程:CXR28资讯网——每日最新资讯28at.com

#import <Foundation/Foundation.h>@interface MyObject : NSObject- (void)methodA;@end@implementation MyObject- (void)methodA {    NSLog(@"Method A is called");}@endint main(int argc, const char * argv[]) {    @autoreleasepool {        MyObject *obj = [[MyObject alloc] init];                // 调用已存在的方法        [obj methodA]; // 输出 "Method A is called"                // 调用不存在的方法        [obj methodB]; // 触发消息转发                // 使用动态方法解析添加方法        class_addMethod([MyObject class], @selector(methodB), class_getMethodImplementation([MyObject class], @selector(methodA)), "v@:");                // 再次调用方法        [obj methodB]; // 输出 "Method A is called"    }    return 0;}

在这个示例中,我们首先创建了一个MyObject类,其中包含了methodA方法。然后,我们创建了一个对象obj,并尝试调用methodA方法,这是一个已存在的方法。CXR28资讯网——每日最新资讯28at.com

接下来,我们尝试调用一个不存在的方法methodB,这将触发消息转发过程。在消息转发过程中,我们使用动态方法解析的方式,将methodB方法的实现与methodA方法的实现关联起来。最后,再次调用methodB方法,它将执行methodA的实现。CXR28资讯网——每日最新资讯28at.com

第五步:消息发送和转发的实际应用场景

消息发送和转发机制在实际应用中有广泛的用途,以下是一些常见的应用场景:CXR28资讯网——每日最新资讯28at.com

  • 动态方法解析: 允许在运行时为对象添加新方法,这对于插件系统和模块化开发非常有用。例如,可以根据需要动态地添加或删除插件功能。
  • 消息转发: 可以将消息转发给其他对象,从而实现代理模式、委托模式和责任链模式。这允许对象在无需了解具体实现的情况下,将任务委派给其他对象。
  • 无法修改源代码的情况下扩展功能: 在某些情况下,无法修改类的源代码,但仍需要扩展其功能。消息转发允许我们通过子类或其他方式扩展对象的功能。
  • AOP(面向切面编程): 可以使用消息发送和转发来实现AOP,例如,在方法调用前后添加日志记录、性能监测和异常处理等方面。
  • 未知消息处理: 如果某个对象需要处理未知的消息或命令,可以使用消息转发机制来处理这些情况。例如,一个通用的消息处理器可以根据不同的消息类型执行不同的操作。

第六步:注意事项

在使用消息发送和转发机制时,需要注意以下几点:CXR28资讯网——每日最新资讯28at.com

  • 性能影响: 消息发送和转发机制可能会带来一定的性能开销,因为它涉及到动态查找方法和传递消息。在需要高性能的场景中,应谨慎使用。
  • 命名规范: 为了避免混淆和错误,应遵循良好的方法命名规范,以确保方法名与消息名称一致。
  • 动态方法解析和消息转发的复杂性: 动态方法解析和消息转发是强大的机制,但也复杂。在使用时需要仔细考虑和测试,以确保正确处理未知消息。
  • 不要滥用: 消息发送和转发机制是强大的工具,但不应滥用。它通常应该作为一种后备机制,用于处理特定情况下的消息,而不是常规编程的方式。

第七步:总结

OC的消息发送和转发机制是这门编程语言的一个核心特性,它使得方法调用更为动态和灵活。理解消息发送和转发的原理,可以帮助开发者更好地利用这一机制,实现面向对象编程的设计模式和思想。CXR28资讯网——每日最新资讯28at.com

消息发送和转发机制具有广泛的实际应用场景,包括动态方法解析、消息转发、AOP编程、无法修改源代码的扩展功能等。通过深入研究和实践,开发者可以更好地掌握消息发送和转发机制,提高代码的灵活性和可扩展性,同时确保应用程序的可维护性和稳定性。这一机制使OC成为一门强大的面向对象编程语言,值得开发者深入学习和探索。CXR28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-13485-0.htmlOC消息发送和转发机制原理

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 八个适合程序员接私活赚钱的开源项目

下一篇: 提升效率和用户体验,携程门票活动商品结构演进

标签:
  • 热门焦点
  • K60 Pro官方停产 第三方瞬间涨价

    K60 Pro官方停产 第三方瞬间涨价

    虽然没有官方宣布,但Redmi的一些高管也已经透露了,Redmi K60 Pro已经停产且不会补货,这一切都是为了即将到来的K60 Ultra铺路,属于厂家的正常操作。但有意思的是该机在停产之后
  • 服务存储设计模式:Cache-Aside模式

    服务存储设计模式:Cache-Aside模式

    Cache-Aside模式一种常用的缓存方式,通常是把数据从主存储加载到KV缓存中,加速后续的访问。在存在重复度的场景,Cache-Aside可以提升服务性能,降低底层存储的压力,缺点是缓存和底
  • 三言两语说透设计模式的艺术-单例模式

    三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • 微信语音大揭秘:为什么禁止转发?

    微信语音大揭秘:为什么禁止转发?

    大家好,我是你们的小米。今天,我要和大家聊一个有趣的话题:为什么微信语音不可以转发?这是一个我们经常在日常使用中遇到的问题,也是一个让很多人好奇的问题。让我们一起来揭开这
  • 一篇文章带你了解 CSS 属性选择器

    一篇文章带你了解 CSS 属性选择器

    属性选择器对带有指定属性的 HTML 元素设置样式。可以为拥有指定属性的 HTML 元素设置样式,而不仅限于 class 和 id 属性。一、了解属性选择器CSS属性选择器提供了一种简单而
  • 电视息屏休眠仍有网络上传 爱奇艺被质疑“薅消费者羊毛”

    电视息屏休眠仍有网络上传 爱奇艺被质疑“薅消费者羊毛”

    记者丨宁晓敏 见习生丨汗青出品丨鳌头财经(theSankei) 前不久,爱奇艺发布了一份亮眼的一季报,不仅营收和会员营收创造历史最佳表现,其运营利润也连续6个月实现增长。自去年年初
  • 共享单车的故事讲到哪了?

    共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
  • 三星Galaxy Z Fold5官方渲染图曝光:13.4mm折叠厚度依旧感人

    三星Galaxy Z Fold5官方渲染图曝光:13.4mm折叠厚度依旧感人

    据官方此前宣布,三星将于7月26日在韩国首尔举办Unpacked活动,届时将带来带来包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy Z Flip 5、
Top