iOS - runtime总结
详细总结一下 Runtime 的核心内容:
1. 消息发送机制
// 消息发送的基本流程
id objc_msgSend(id self, SEL _cmd, ...) {// 1. 获取 isaClass cls = object_getClass(self);// 2. 查找缓存IMP imp = cache_getImp(cls, _cmd);if (imp) return imp(self, _cmd, ...);// 3. 方法查找imp = lookUpImpOrForward(cls, _cmd);// 4. 执行方法return imp(self, _cmd, ...);
}
2. 类与对象结构
2.1 对象结构
struct objc_object {isa_t isa; // isa 指针
};// isa 的位域结构
union isa_t {uintptr_t bits;struct {uintptr_t nonpointer : 1; // 是否优化的 isa 指针uintptr_t has_assoc : 1; // 是否有关联对象uintptr_t has_cxx_dtor : 1; // 是否有 C++ 析构函数uintptr_t shiftcls : 33; // 类的指针// ...其他位域};
};
2.2 类结构
struct objc_class : objc_object {Class superclass;cache_t cache; // 方法缓存class_data_bits_t bits; // 类的相关信息class_rw_t *data() {return bits.data();}
};
3. 方法缓存机制
struct cache_t {struct bucket_t *_buckets; // 散列表mask_t _mask; // 容量掩码mask_t _occupied; // 已使用数量IMP imp(SEL sel) {bucket_t *b = buckets();mask_t m = mask();// 查找方法实现return findMethod(b, m, sel);}
};
4. 类的加载过程
void _objc_init(void) {// 1. 初始化锁runtime_init();// 2. 读取镜像信息map_images();// 3. 加载类和分类load_images();// 4. 调用 +load 方法call_load_methods();
}void call_load_methods(void) {// 1. 按顺序调用类的 +loadcall_class_loads();// 2. 调用分类的 +loadcall_category_loads();
}
5. 关联对象
// 关联对象表
struct AssociationsManager {static AssociationsHashMap *_map;void setObject(id object, void *key, id value) {// 存储关联对象}id getObject(id object, void *key) {// 获取关联对象}
};
6. 弱引用机制
struct weak_table_t {weak_entry_t *weak_entries;size_t num_entries;uintptr_t mask;void insert(id referent, id *referrer) {// 添加弱引用}void remove(id referent) {// 移除弱引用}
};
7. 自动释放池
class AutoreleasePoolPage {static pthread_key_t const key = AUTORELEASE_POOL_KEY;id *next;pthread_t const thread;AutoreleasePoolPage *child;void *push() {// 压入新的自动释放池}void pop(void *token) {// 释放对象}
};
8. Method Swizzling
void method_exchangeImplementations(Method m1, Method m2) {if (!m1 || !m2) return;mutex_locker_t lock(runtimeLock);IMP imp1 = method_getImplementation(m1);IMP imp2 = method_getImplementation(m2);method_setImplementation(m1, imp2);method_setImplementation(m2, imp1);
}
9. 动态方法解析
void _class_resolveMethod(Class cls, SEL sel) {if (! cls->isMetaClass()) {// 实例方法解析resolveInstanceMethod(cls, sel);} else {// 类方法解析resolveClassMethod(cls, sel);}
}
10. 性能优化
// 1. 方法缓存
static inline IMP cache_getImp(Class cls, SEL sel) {cache_key_t key = cache_key(sel);return cls->cache.find(key);
}// 2. isa 优化
inline Class
objc_object::ISA() {assert(!isTaggedPointer()); return (Class)(isa.bits & ISA_MASK);
}
关键特性:
- 动态性:运行时决议
- 消息发送机制
- 方法缓存优化
- 类动态加载
- 关联对象支持
- 弱引用管理
- 自动释放池
- 方法替换能力
- 动态方法解析
- 性能优化机制
这些特性使 Objective-C Runtime 成为一个强大而灵活的运行时系统。
相关文章:
iOS - runtime总结
详细总结一下 Runtime 的核心内容: 1. 消息发送机制 // 消息发送的基本流程 id objc_msgSend(id self, SEL _cmd, ...) {// 1. 获取 isaClass cls object_getClass(self);// 2. 查找缓存IMP imp cache_getImp(cls, _cmd);if (imp) return imp(self, _cmd, ...);…...
第33 章 - ES 实战篇 - MySQL 与 Elasticsearch 的一致性问题
思维导图 0. 前言 MySQL 与 Elasticsearch 一致性问题是老生常谈了。网上有太多关于这方面的文章了,但是千篇一律,看了跟没看没有太大区别。 在生产中,我们往往会通过 DTS 工具将 binlog 导入到 Kafka,再通过 Kafka 消费 binlog&…...
Artec Leo 3D扫描仪与Ray助力野生水生动物法医鉴定【沪敖3D】
挑战:捕获大型水生哺乳动物(如鲸鱼)的数据,搭建全彩3D模型,用于水生野生动物的法医鉴定、研究和保护工作。 解决方案:Artec Eva、Artec Space Spider、Artec Leo、Artec Ray、Artec Studio、CT scans 效果&…...
PythonQT5打包exe线程使用
打包: pyinstaller --noconsole --onefile test.py–noconsole 表示不需要打开命令行 修改:test.spec 一般项目里面需要用的资源文件,比如lib、png、exe等。 需要单独修改spec文件 pathex[.],binaries[(D:/test.png, .),(D:/simsun.ttc, .…...
【Powershell】Windows大法powershell好(二)
PowerShell基础(二) 声明:该笔记为up主 泷羽的课程笔记,本节链接指路。 警告:本教程仅作学习用途,若有用于非法行为的,概不负责。 1. powershell 执行外部命令 powershell也可以执行一些外部的…...
前端学习-环境this对象以及回调函数(二十七)
目录 前言 目标 环境对象 作用 环境对象this是什么? 判断this指向的粗略规则是什么? 回调函数 目标 常见的使用场景 综合案例:Tab任务栏切换 总结 前言 男儿何不带吴钩,收取关山五十州 目标 能够分析判断函数运行在不…...
Element-plus、Element-ui之Tree 树形控件回显Bug问题。
需求:提交时,需要把选中状态和半选中状态 的数据id提交。如图所示: 数据回显时,会出现代码如下: <template><el-tree ref"treeRef" :data"tree" show-checkbox node-key"id" …...
互联网全景消息(10)之Kafka深度剖析(中)
一、深入应用 1.1 SpringBoot集成Kafka 引入对应的依赖。 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupI…...
Oracle Dataguard(主库为双节点集群)配置详解(5):将主库复制到备库并启动同步
Oracle Dataguard(主库为双节点集群)配置详解(5):将主库复制到备库并启动同步 目录 Oracle Dataguard(主库为双节点集群)配置详解(5):将主库复制到备库并启动…...
pytorch小记(一):pytorch矩阵乘法:torch.matmul(x, y)
pytorch小记(一):pytorch矩阵乘法:torch.matmul(x, y)/ x y 代码代码 1:torch.matmul(x, y)输入张量:计算逻辑:输出结果: 代码 2:y y.view(4,1)…...
PyTorch环境配置常见报错的解决办法
目标 小白在最基础的环境配置里一般都会出现许多问题。 这里把一些常见的问题分享出来。希望可以节省大家一些时间。 最终目标是可以在cmd虚拟环境里进入jupyter notebook,new的时候有对应的环境,并且可以跑通所有的import code。 第一步:…...
罗永浩再创业,这次盯上了 AI?
罗永浩,1972年7月9日生于中国延边朝鲜族自治州的一个军人家庭,是一名朝鲜族人;早年在新东方授课,2004年当选 “网络十大红人” ;2006年8月1日,罗永浩创办牛博网;2008年5月,罗永浩注册…...
VUE3 provide 和 inject,跨越多层级组件传递数据
provide 和 inject 是 Vue 3 提供的 API,主要用于实现祖先组件与后代组件之间的依赖注入。它们可以让你在组件树中,跨越多层组件传递数据,而不需要通过 props 或事件的方式逐层传递。这个机制主要用于状态共享、插件系统或某些跨层级的功能。…...
git打补丁
1、应用场景 跨仓库升级 开发项目B使用的是开源项目A。开源项目A发现漏洞,作者进行了修复,我们可以通过使用git补丁的方式,将作者修改的内容复制到我 们的项目B中。 2、TortoiseGit方式 源仓库 格式化补丁 根据提交数量,生成…...
机械燃油车知识图谱、知识大纲、知识结构(持续更新...)
一、发动机 曲柄连杆机构 配气机构 点火系统 起动系统 燃油供给系统 润滑系统 冷却系统 二、底盘 (一)传动系统 1、离合器 2、变速器 3、万向传动装置 4、驱动桥 (二)行驶系统 1、车架 2、车桥 3、悬架 4、车轮 &a…...
Vue3学习总结
一、Vue 3 基础搭建与核心语法 1.创建 Vue 3 应用 在项目的入口文件 main.js 中,通过以下代码创建 Vue 3 应用实例: import { createApp } from vue; import App from ./App.vue;const app createApp(App); app.mount(#app); 这几行代码的作用是引入…...
Type-C双屏显示器方案
在数字化时代,高效的信息处理和视觉体验已成为我们日常生活和工作的关键需求。随着科技的进步,一款结合了便携性和高效视觉输出的设备——双屏便携屏,逐渐崭露头角,成为追求高效工作和娱乐体验人群的新宠。本文将深入探讨双屏便携…...
【读书与思考】焦虑与内耗
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 导言 今天一个朋友和我说,最近比较焦虑和内耗,无心工作和学习,我问他你焦虑内耗的时候,时间主要花在哪了,他告诉我说主要花在看有关移…...
基于python的网页表格数据下载--转excel
基于 Python 的网页表格数据爬取与下载:以维基百科为例 目录 基于 Python 的网页表格数据爬取与下载:以维基百科为例1. 背景介绍2. 工具与环境3. 操作步骤1. 获取网页内容2. 定位表格元素3. 表格变身 Pandas DataFrame4. 检查数据,收工!5. 进阶玩法与优化6. 完整代码4. 结果…...
Vue.js开发入门:从零开始搭建你的第一个项目
前言 嘿,小伙伴们!今天咱们来聊聊 Vue.js,一个超火的前端框架。如果你是编程小白,别怕,跟着我一步步来,保证你能轻松上手,搭建起属于自己的第一个 Vue 项目。Vue.js 可能听起来有点高大上&#…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...
VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...
