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);
}

关键特性:

  1. 动态性:运行时决议
  2. 消息发送机制
  3. 方法缓存优化
  4. 类动态加载
  5. 关联对象支持
  6. 弱引用管理
  7. 自动释放池
  8. 方法替换能力
  9. 动态方法解析
  10. 性能优化机制

这些特性使 Objective-C Runtime 成为一个强大而灵活的运行时系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/305.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 Flownex 网络中创建传热元件

本文探讨了在 Flownex 仿真中集成新传热元件的步骤,以增强热系统管理能力。 了解 Flownex 中的传热元件 Flownex 中的传热元件复制传导、对流和辐射,从而深入了解系统的热流体行为。准确建模复杂系统需要了解这些单元的特性和功能。Flownex 的高级功能…

《OpenCV计算机视觉实战项目》——银行卡号识别

文章目录 项目任务及要求项目实现思路项目实现及代码导入模块设置参数对模版图像中数字的定位处理银行卡的图像处理读取输入图像,预处理找到数字边框使用模版匹配,计算匹配得分 画出并打印结果 项目任务及要求 任务书: 要为某家银行设计一套…

PyCharm文档管理

背景:使用PyCharmgit做文档管理 需求:需要PyCharm自动识别docx/xslx/vsdx等文件类型,并在PyCharm内点击文档时唤起系统内关联应用(如word、excel、visio) 设置步骤: 1、file -》 settings -》file types 2、在Files opened i…

景联文科技提供高质量多模态数据处理服务,驱动AI新时代

在当今快速发展的AI时代,多模态数据标注成为推动人工智能技术进步的关键环节。景联文科技作为行业领先的AI数据服务提供商,专注于为客户提供高质量、高精度的多模态数据标注服务,涵盖图像、语音、文本、视频及3D点云等多种类型的数据。通过专…

django基于Python的智能停车管理系统

1.系统概述 1.定义:Django 基于 Python 的智能停车管理系统是一个利用 Django 框架构建的软件系统,用于高效地管理停车场的各种事务,包括车辆进出记录、车位预订、收费管理等诸多功能。 2.目的:它的主要目的是提高停车场的运营效…

【Rust】切片类型

目录 思维导图 1. 切片类型概述 2. 函数示例:获取字符串中的第一个单词 2.1 问题描述 2.2 初步实现 2.3 代码实现 3. 切片的引入 3.1 切片的定义 3.2 切片的优势 3.3 改进后的函数 4. 函数参数的通用性 4.1 改进函数签名 4.2 示例代码 5. 其他切片类型…

微信小程序-Docker+Nginx环境配置业务域名验证文件

在实际开发或运维工作中,我们时常需要在 Nginx 部署的服务器上提供一个特定的静态文件,用于域名验证或第三方平台验证。若此时使用 Docker 容器部署了 Nginx,就需要将该验证文件正确地映射(挂载)到容器中,并…

鸿蒙UI(ArkUI-方舟UI框架)

参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/arkts-layout-development-overview-V13 ArkUI简介 ArkUI(方舟UI框架)为应用的UI开发提供了完整的基础设施,包括简洁的UI语法、丰富的UI功能&#xff…

图片和短信验证码(头条项目-06)

1 图形验证码接口设计 将后端⽣成的图⽚验证码存储在redis数据库2号库。 结构: {img_uuid:0594} 1.1 创建验证码⼦应⽤ $ cd apps $ python ../../manage.py startapp verifications # 注册新应⽤ INSTALLED_APPS [django.contrib.admin,django.contrib.auth,…

SpringCloud系列教程:微服务的未来(十二)OpenFeign连接池、最佳实践、日志、微服务拆分

本篇博客将讨论如何优化 OpenFeign 的连接池配置,如何使用最佳实践提升服务间通信的效率和可维护性,并探讨如何通过拆分服务来提升微服务架构的灵活性和可扩展性,具体涵盖了用户服务和交易服务的拆分。 目录 前言 OpenFeign 连接池 最佳实…

进阶——十六届蓝桥杯嵌入式熟练度练习(LED的全开,全闭,点亮指定灯,交替闪烁,PWM控制LED呼吸灯)

点亮灯的函数 void led_show(unsigned char upled) { HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOC,upled<<8,GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RE…

动态规划【打家劫舍】

今天和大家分享一下动态规划当中的打家劫舍题目&#xff0c;希望在大家刷题的时候提供一些思路 打家劫舍1&#xff1a; 题目链接&#xff1a; 198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋…

Jaeger UI使用、采集应用API排除特定路径

Jaeger使用 注&#xff1a; Jaeger服务端版本为&#xff1a;jaegertracing/all-in-one-1.6.0 OpenTracing版本为&#xff1a;0.33.0&#xff0c;最后一个版本&#xff0c;停留在May 06, 2019。最好升级到OpenTelemetry。 Jaeger客户端版本为&#xff1a;jaeger-client-1.3.2。…

Vue-Cli

一.vue.js 1.优点 1)体积小,压缩后33K 2)更高的运行效率 3)双向数据绑定 4)生态丰富,学习成本低 2.Vue指令 指令带有前缀 v- 开头&#xff0c;以表示它们是 Vue 提供的特殊属性。 1)v-text (1)作用 &#xff1a;设置标签的文本内容 默认写法会替换全部内容&#xff0c…

【源码解析】Java NIO 包中的 ByteBuffer

文章目录 1. 前言2. ByteBuffer 概述3. 属性4. 构造器5. 方法5.1 allocate 分配 Buffer5.2 wrap 映射数组5.3 slice 获取子 ByteBuffer5.4 duplicate 复刻 ByteBuffer5.5 asReadOnlyBuffer 创建只读的 ByteBuffer5.6 get 方法获取字节5.7 put 方法往 ByteBuffer 里面加入字节5.…

HTML5实现好看的中秋节网页源码

HTML5实现好看的中秋节网页源码 前言一、设计来源1.1 网站首页界面1.2 登录注册界面1.3 节日由来界面1.4 节日习俗界面1.5 节日文化界面1.6 节日美食界面1.7 节日故事界面1.8 节日民谣界面1.9 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看…

OA项目登录

导入依赖,下面的依赖是在这次OA登录中用到的 <!--web依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.sprin…

YangQG 面试题汇总

一、交叉链表 问题&#xff1a; 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 解题思想&#xff1a; 双指针 备注&#xff1a;不是快慢指针&#xff0c;如果两个长度相…

【面试题】技术场景 4、负责项目时遇到的棘手问题及解决方法

工作经验一年以上程序员必问问题 面试题概述 问题为在负责项目时遇到的棘手问题及解决方法&#xff0c;主要考察开发经验与技术水平&#xff0c;回答不佳会影响面试印象。提供四个回答方向&#xff0c;准备其中一个方向即可。 1、设计模式应用方向 以登录为例&#xff0c;未…

WEB前端-3.2

目录 css 【例】飙升榜 【源码】 css 【例】飙升榜 【源码】 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"&g…