iOS - runtime总结

server/2025/1/16 0:59:39/

详细总结一下 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.ppmy.cn/server/158266.html

相关文章

开源AI模型的优势、挑战与未来发展分析

开放源代码模型在灵活性和生态系统方面具有竞争力,可能会超越闭源API 开放源代码模型在灵活性和生态系统方面的竞争力主要体现在以下几个方面: 1. 灵活性 定制化能力: 开放源代码模型允许用户根据特定需求进行修改和调整。这种灵活性使得开发者能够根…

【YOLOv5】源码(train.py)

train.py是YOLOv5中用于模型训练的脚本文件,其主要功能是读取配置文件、设置训练参数、构建模型结构、加载数据、训练/验证模型、保存模型权重文件、输出日志等 参考笔记: 【YOLOv3】源码(train.py)_yolo原始代码-CSDN博客 【y…

Blazor开发复杂信息管理系统的优势

随着现代企业信息管理需求的不断提升,开发高效、易维护、可扩展的系统变得尤为重要。在这个过程中,Blazor作为一种新兴的Web开发框架,因其独特的优势,逐渐成为开发复杂信息管理系统的首选技术之一。本文将结合Blazor在开发复杂信息…

第一章 Anaconda包管理工具安装

一、Anaconda是什么 1.Anaconda是一个开源的包管理系统和环境用于安装多个版本的软件包的管理系统及其依赖项,并在它们之间轻松切换。它适用于Linux、macOS和Windows,并且是为Python程序创建的,但可以 打包和分发任何软件 2.Anaconda是一个数…

C# 内存篇

C#程序在CLR上运行的时候,内存从逻辑上划分为两大块:堆(托管堆)和栈(堆栈)。 堆:堆是一块动态分配的内存区域,用于存储对象和数据,堆内存的分配和释放由CLR(公共语音运行库)管理,通过垃圾回收(G…

学习threejs,使用TrackballControls相机控制器

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.TrackballControls 相…

Scratch编程:点燃编程学习热情的火种

一、Scratch编程的起源与发展 Scratch 是由麻省理工学院媒体实验室(MIT Media Lab)开发的一款图形化编程工具。其项目始于 2003 年,主要目标是为了让孩子们能够轻松地创建自己的交互式故事、动画、游戏、音乐和艺术作品,从而在创…

Spring Boot项目中如何使用日志记录

在Spring Boot中,日志记录是开发中非常重要的一部分。Spring Boot 默认集成了 SLF4J 和 Logback 作为日志框架。你可以使用它们来记录应用程序的日志。以下是如何在Spring Boot中使用日志记录的步骤,包含实际场景和示例代码。 1. 引入依赖(默…