Message passing mechanism (消息传递机制)
objc_msgSend 是 Objective-C 运行时系统中的一个核心函数,用于实现消息传递机制。在 Objective-C 中,方法调用实际上是消息传递的过程,当你在代码中调用一个方法时,编译器会将其转换为 objc_msgSend 函数的调用。
objc_msgSend 的作用
objc_msgSend 的主要作用是:
-
方法查找: 根据消息的接收者(对象)和选择器(方法名),在接收者对象的类及其父类的类方法列表中查找相应的方法实现(IMP)。
-
方法调用: 一旦找到方法实现,
objc_msgSend会调用该实现,传递参数并返回结果。
objc_msgSend 的工作流程
objc_msgSend 的工作流程可以分为以下几个步骤:
-
查找接收者对象的类: 根据接收者对象的指针找到其所属的类。
-
查找方法缓存: 每个类都有一个方法缓存,用于加速方法查找。如果在缓存中找到相应的方法实现(IMP),则直接调用该实现。
-
查找方法列表: 如果在方法缓存中没有找到,
objc_msgSend会在接收者类的方法列表中查找相应的方法实现。如果找到,则更新缓存并调用该实现。 -
沿继承链查找: 如果在接收者类的方法列表中没有找到,
objc_msgSend会沿着继承链向上查找父类的方法列表,直到根类(通常是NSObject)为止。

-
消息转发: 如果最终没有找到相应的方法实现,运行时系统会进入消息转发机制,允许对象动态处理未实现的方法。具体步骤包括:
- 调用
forwardingTargetForSelector:方法,询问接收者是否有替代对象可以处理消息。 - 调用
methodSignatureForSelector:和forwardInvocation:方法,允许接收者创建并转发消息。
- 调用
使用示例
在代码中调用方法时,实际会转换为 objc_msgSend 的调用。例如:
[myObject doSomething];
会被转换为:
objc_msgSend(myObject, @selector(doSomething));
示例代码说明
以下是一个简单示例,展示 objc_msgSend 的工作流程:
#import <objc/runtime.h>
#import <objc/message.h>@interface MyClass : NSObject
- (void)doSomething;
@end@implementation MyClass
- (void)doSomething {NSLog(@"Doing something");
}
@endint main(int argc, char * argv[]) {@autoreleasepool {MyClass *myObject = [[MyClass alloc] init];SEL selector = @selector(doSomething);((void (*)(id, SEL))objc_msgSend)(myObject, selector);}return 0;
}
在这个示例中:
- 定义了一个
MyClass类,并实现了doSomething方法。 - 在
main函数中,创建了MyClass的实例,并获取了doSomething方法的选择器。 - 使用
objc_msgSend函数调用doSomething方法。
注意事项
由于 objc_msgSend 是一个底层函数,其调用方式与普通函数不同,需要正确传递参数类型和返回类型。以下是一些常见的 objc_msgSend 函数变体:
objc_msgSend: 用于返回id类型的结果。objc_msgSend_stret: 用于返回结构体类型的结果。objc_msgSend_fpret: 用于返回浮点类型的结果。objc_msgSendSuper: 用于在子类中调用父类的方法。
结论
objc_msgSend 是 Objective-C 运行时系统的核心函数,负责消息传递和方法调用。它通过在类的方法列表和继承链中查找方法实现,并最终调用找到的方法,实现了动态、灵活的消息传递机制。理解 objc_msgSend 的工作原理对于深入了解 Objective-C 运行时系统和高级开发技巧非常重要。
相关文章:
Message passing mechanism (消息传递机制)
objc_msgSend 是 Objective-C 运行时系统中的一个核心函数,用于实现消息传递机制。在 Objective-C 中,方法调用实际上是消息传递的过程,当你在代码中调用一个方法时,编译器会将其转换为 objc_msgSend 函数的调用。 objc_msgSend …...
详解 Spark SQL 代码开发之数据读取和保存
一、通用操作 /** 基本语法:1.读取:SparkSession.read[.format("format")[.option("...")]].load("path")2.保存:DataFrame.write[.format("format")[.option("...")]][.mode("Save…...
Pulsar 社区周报 | No.2024-05-30 | BIGO 百页小册《Apache Pulsar 调优指南》
“ 各位热爱 Pulsar 的小伙伴们,Pulsar 社区周报更新啦!这里将记录 Pulsar 社区每周的重要更新,每周发布。 ” BIGO 百页小册《Apache Pulsar 调优指南》 Hi,Apache Pulsar 社区的小伙伴们,社区 2024 上半年度的有奖问…...
第二证券股票杠杆:4分钟直线涨停!这一赛道,AH股集体爆发!
今日早盘,A股继续小幅震动收拾,首要股指涨跌互现,两市个股跌多涨少,成交有萎缩的趋势。 盘面上,医药、中字头、旅游、房地产等板块相对活跃,混合实践、玻璃基板、AI手机PC、光刻机等板块跌幅居前。 “中字…...
JavaScript 进阶征途:解锁Function奥秘,深掘Object方法精髓
个人主页:学习前端的小z 个人专栏:JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 🈵Function方法 与 函数式编程💝1 call 💝…...
斜拉桥智慧施工数字孪生
基于图扑自主研发的 HT for Web 产品,利用现场照片及 CAD 图纸,结合 PBR 材质,搭建了具有赛博朋克风格的智慧斜拉桥可视化解决方案,精准复现斜拉桥建造规划过程,辅助运维人员对桥梁基建过程的网格化管理。提高桥梁的建…...
【chatGPT API】Function Calling:将自然语言转换为API调用或数据库查询
文章目录 一. 介绍二. 常见用例与Function Calling调用逻辑三. 调用细节1. 调用行为:tool_choice2. 调用规定:functions 四. 实战:查询公司相关产品 一. 介绍 OpenAI可以根据用户的要求输出一个符合用户要求的入参值。然后用户拿到入参值之后…...
Oracle Hint /*+APPEND*/插入性能总结
oracle append用法 Oracle中的APPEND用法主要用于提高数据插入的效率。 基本用法:在使用了APPEND选项后,插入数据会直接加到表的最后面,而不会在表的空闲块中插入数据。这种做法不需要寻找freelist中的free block,从而避免了在…...
正邦科技(day3)
出厂测试 设备校准 这个需要注意的是校准电流、电压、电感的时候有时候负感器会装反,mcu会坏,需要flash一下清空内存...
mac电脑多协议远程管理软件:Termius 8.4.0激活版下载
Termius 是一款功能强大的跨平台远程访问工具,可用于管理和连接各种远程系统和服务器。它支持SSH、Telnet、SFTP和Serial协议,并提供了键盘快捷键、自动完成和多标签功能,使用户可以方便地控制和操作远程主机。 Termius 提供了端到端的加密保…...
网络攻击的常见形式
开篇 本篇文章来自于《网络安全 ——技术与实践》的学习整理笔记。 正篇 口令窃取 相比于利用系统缺陷破坏网络系统,最容易的方法还是通过窃取用户的口令进入系统。因为人们倾向于选择很糟糕的口令作为登录密码,所以口令猜测很容易成功。通常࿰…...
ReactDOM 18版本 使用createRoot 替换render详解
概述 React 18 提供了两个 root API,被称之为 Legacy Root API 和 New Root API: Legacy Root API:是指之前版本的 root API ReactDOM.render,它将创建一个以 “legacy” 模式运行的 root,其工作方式与 React 17 完全…...
【赠书活动】好书推荐—《详解51种企业应用架构模式》
导读: 企业应用包括哪些?它们又分别有哪些架构模式?世界著名软件开发大师Martin Fowler给你答案。 01 什么是企业应用 我的职业生涯专注于企业应用,因此,这里所谈及的模式也都是关于企业应用的。(企业应用…...
SpringBoot启动时使用外置yml文件
第一步:打包时排除yml文件 <build><resources><resource><!-- 排除的文件的路径 --><directory>src/main/resources</directory><excludes><!-- 排除的文件的名称 --><exclude>application-dev.yml</e…...
【开源三方库】Fuse.js:强大、轻巧、零依赖的模糊搜索库
1.简介 Fuse.js是一款功能强大且轻量级的JavaScript模糊搜索库,支持OpenAtom OpenHarmony(以下简称“OpenHarmony”)操作系统,它具备模糊搜索和排序等功能。该库高性能、易于使用、高度可配置,支持多种数据类型和多语…...
vue从入门到精通(六):数据代理
一,什么是数据代理 通过一个对象代理对另一个对象中属性的操作 二,object.defineproperty方法 object.defineproperty方法可以对对象追加属性 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>object…...
【C++修行之道】类和对象(二)类的6个默认成员函数、构造函数、析构函数
目录 一、类的6个默认成员函数 二、构造函数 2.1 概念 2.2 特性 2.2.5 自动生成默认构造函数 不进行显示定义的隐患: 2.2.6 自动生成的构造函数意义何在? 两个栈实现一个队列 2.2.7 无参的构造函数和全缺省的构造函数都称为默认构造函数&#x…...
【LeetCode热题100总结】239. 滑动窗口最大值
题目描述 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1: 输入:nums [1,3,-1,-3,5,3,6,7]…...
【YOLOv9改进[Conv]】使用YOLOv10的空间通道解耦下采样SCDown模块替换部分CONv的实践 + 含全部代码和详细修改内容
本文将使用YOLOv10的空间通道解耦下采样SCDown模块替换部分CONv的实践 ,文中含全部代码和详细修改内容。 目录 一 YOLOv10 1 空间通道解耦下采样 2 可视化...
简单小游戏制作
控制台基础设置 //隐藏光标 Console.CursorVisible false; //通过两个变量来存储舞台的大小 int w 50; int h 30; //设置舞台(控制台)的大小 Console.SetWindowSize(w, h); Console.SetBufferSize(w, h);多个场景 int nowSceneID 1; while (true) …...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
