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 可能听起来有点高大上&#…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...

macOS 终端智能代理检测
🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub 在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如: fatal: unable to access https://github.com/ohmyzsh/oh…...

DeepSeek越强,Kimi越慌?
被DeepSeek吊打的Kimi,还有多少人在用? 去年,月之暗面创始人杨植麟别提有多风光了。90后清华学霸,国产大模型六小虎之一,手握十几亿美金的融资。旗下的AI助手Kimi烧钱如流水,单月光是投流就花费2个亿。 疯…...