当前位置: 首页 > news >正文

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.lryc.cn/news/519840.html

相关文章:

  • 第33 章 - ES 实战篇 - MySQL 与 Elasticsearch 的一致性问题
  • Artec Leo 3D扫描仪与Ray助力野生水生动物法医鉴定【沪敖3D】
  • PythonQT5打包exe线程使用
  • 【Powershell】Windows大法powershell好(二)
  • 前端学习-环境this对象以及回调函数(二十七)
  • Element-plus、Element-ui之Tree 树形控件回显Bug问题。
  • 互联网全景消息(10)之Kafka深度剖析(中)
  • Oracle Dataguard(主库为双节点集群)配置详解(5):将主库复制到备库并启动同步
  • pytorch小记(一):pytorch矩阵乘法:torch.matmul(x, y)
  • PyTorch环境配置常见报错的解决办法
  • 罗永浩再创业,这次盯上了 AI?
  • VUE3 provide 和 inject,跨越多层级组件传递数据
  • git打补丁
  • 机械燃油车知识图谱、知识大纲、知识结构(持续更新...)
  • Vue3学习总结
  • Type-C双屏显示器方案
  • 【读书与思考】焦虑与内耗
  • 基于python的网页表格数据下载--转excel
  • Vue.js开发入门:从零开始搭建你的第一个项目
  • LS1046+XILINX XDMA PCIE调通
  • HarmonyOS:@LocalBuilder装饰器: 维持组件父子关系
  • YOLOv10-1.1部分代码阅读笔记-downloads.py
  • 计算机图形学【绘制立方体和正六边形】
  • 基于django中医药数据可视化平台(源码+lw+部署文档+讲解),源码可白嫖!
  • kafka消费堆积问题探索
  • Vue.js 使用插槽(Slots)优化组件结构
  • Broker如何进行定时心跳发送和故障感知
  • 网络安全设备主要有什么
  • Android Framework WMS全面概述和知识要点
  • 记一次某红蓝演练经历