CocoaPods 源码导读:架构总览

本系列基于 CocoaPods 1.16.2(2026 年 4 月)源码进行分析。源码仓库由 15 个 Ruby Gem 组成,本文先从整体架构与职责拆分讲起,再以 pod install --repo-update 为主线绘制全景执行图,串起后续两篇专题的切入点。 系列目录: 架构总览(本文) 从命令到依赖求解 从下载到工程集成 一、CocoaPods 不是单一仓库 很多人以为 CocoaPods 就是一个 Ruby 项目,其实官方仓库 CocoaPods/CocoaPods 只是入口,真正的能力被拆成 15 个独立 gem,每个 gem 只做一件事。用 gem dependency cocoapods 会看到这样的依赖拓扑: graph TB subgraph "入口" A["bin/pod(CocoaPods gem)"] end subgraph "命令行框架" B["CLAideCommand/Arg/Option DSL"] end subgraph "领域模型" C["CorePodfile/Podspec/Source/Lockfile"] end subgraph "依赖求解" D["Molinillo回溯式 SAT 求解器"] end subgraph "下载" E["cocoapods-downloaderGit/HTTP/SVN/Hg/SCP"] end subgraph "Xcode 工程读写" F["Xcodeprojpbxproj/xcconfig/workspace"] G["NanaimoASCII plist 解析"] end subgraph "插件与子命令" H["cocoapods-plugins"] I["cocoapods-trunkcocoapods-searchcocoapods-trycocoapods-deintegrate"] end subgraph "辅助" J["cork彩色输出"] K["nap轻量 HTTP 客户端"] end A --> B A --> C A --> D A --> E A --> F F --> G A -.加载.-> H H -.调用.-> I A --> J I --> K 各 gem 的一句话职责: ...

May 2, 2026

Objective-C KVC 作用与实现原理

Key-Value Coding / Foundation behavior with objc4 runtime support Objective-C KVC:从字符串 key 到对象读写 KVC 的核心价值是:把“访问某个属性或实例变量”抽象成 valueForKey:、setValue:forKey: 这样的字符串协议。 读完这一页,你应该能说清楚它解决什么问题、Foundation 大致怎样查找成员, 以及 objc4 runtime 在消息发送、元数据查询、ivar 直写和内存管理上提供了哪些支撑。 适合第一次系统理解 KVC 标注 objc4 / Foundation 边界 含关键流程和注释代码 目录 KVC 到底有什么用 本仓库能看到什么 读写 key 的查找顺序 objc4 提供的底层能力 核心类、方法和关键属性 关键操作流程 常见坑与记忆模型 1. KVC 到底有什么用 平时你写 person.name 或 [person name],访问目标在编译期就固定了。 KVC 允许你在运行时才决定要访问哪个成员:[person valueForKey:@"name"]。 这使得对象、字典、表单、序列化、绑定和调试工具可以用同一套字符串 key 访问模型对象。 动态访问 运行时才知道字段名时,用字符串 key 读取或写入对象。 统一映射 JSON、表单、数据库行、UI 绑定都可以映射到对象属性。 批量和路径 valueForKeyPath: 能沿着 department.manager.name 连续取值。 ...

June 1, 2026

Objective-C KVO 作用与实现原理

objc4 runtime reading note KVO:从“属性变化通知”到 runtime 动态子类 KVO(Key-Value Observing)让一个对象在另一个对象的某个 key path 变化时收到回调。 在这个 objc4 仓库里,Foundation 的 KVO 主体代码不在源码中;但 runtime 暴露了 KVO 需要的关键能力: 复制类、切换对象的 isa、判断 ivar 内存语义,并保证这些操作在初始化、弱引用和并发加载场景下安全。 入口:addObserver 核心:动态子类 通知:will/didChange 底层:objc_duplicateClass 阅读路线 KVO 解决什么问题 实现原理总览 objc4 中的关键支撑 核心类和关键方法 关键流程 带注释代码片段 使用边界和排错 1. KVO 的作用:把“状态变化”变成可订阅事件 普通属性赋值只改变对象内部状态,调用者不知道“谁关心这个变化”。KVO 把某个 key path 的变化包装成标准事件: 被观察对象负责发出变化,观察者在 observeValueForKeyPath:ofObject:change:context: 中接收。 解耦 观察者不需要改写被观察对象的业务代码,只注册感兴趣的 key path。 统一格式 变化以 change 字典传递,可包含旧值、新值、变化类型等。 自动拦截 对 KVC/KVO 兼容的 setter,Foundation 可自动在 setter 前后发通知。 手动通知 复杂派生属性或批量变化可用 willChangeValueForKey: 和 didChangeValueForKey: 明确包围。 ...

June 1, 2026

runtime/hashtable2.mm 作用与实现原理

objc4 runtime NXHashTable 集合结构 runtime/hashtable2.mm 作用与实现原理 这个文件实现了旧 NeXT/Objective-C runtime 暴露的 NXHashTable:一个可存放任意指针或整数数据的哈希集合。它不保存 key-value 对;需要映射关系时,runtime 另用 maptable.mm 的 NXMapTable。 一遍读懂 它用 callback 决定“怎么 hash、怎么判等、怎么释放”。 每个 bucket 是一条很短的冲突链。 bucket 中只有 1 个元素时直接存指针,避免额外分配。 元素数超过 bucket 数时扩容并重算位置。 删除会把 2 个元素的 bucket 收缩回单指针形态。 1. 它解决什么问题 NXHashTable 是 runtime 内部和兼容 API 使用的通用集合容器。调用者传入一组 NXHashTablePrototype,告诉表如何处理元素:hash(info, data) 计算哈希,isEqual(info, a, b) 判断相等,free(info, data) 在销毁或 reset 时释放元素。这样同一套表结构可以存指针、字符串,或“结构体首字段作为 key”的对象。 **关键不变量:**如果两个元素被 isEqual 判为相等,它们的 hash 必须一致;而且参与 hash 的内容不能在入表后变化。否则扩容重排后会找不到元素。 2. 数据结构:一层数组 + 小冲突链 NXHashTable保存 prototype、元素总数、bucket 数组和可透传给 callback 的 info。 ...

June 1, 2026

runtime/maptable.h 作用与实现原理

objc4 runtime NXMapTable 开放寻址哈希表 runtime/maptable.h runtime/maptable.h 作用与实现原理 runtime/maptable.h 定义了 Objective-C runtime 里旧 NeXT 风格的 NXMapTable:一个通用的 key - value 指针映射表。 它不拥有业务对象,只负责把指针或整数形式的 key 映射到指针或整数形式的 value, 并通过回调把“怎么 hash、怎么比较、释放时怎么处理”交给调用方决定。 存储模型连续桶数组,每个桶是 {key, value}。 冲突处理开放寻址 + 线性探测。 扩容阈值元素数超过桶数的 75% 后翻倍重哈希。 runtime 用途类名表、协议表、future class 表、少量 meta 到 non-meta 映射。 阅读路径 它解决什么问题 和 hashtable2 的区别 核心数据结构 Prototype 回调机制 查找、插入、删除、扩容流程 带注释核心代码 runtime 中的实际使用 必须记住的约束 1. 它解决什么问题 runtime 需要维护很多“名字到结构体指针”“元类到类”“未来会出现的类名到占位 Class”的映射。 这些映射发生在启动、加载镜像、注册类、查找协议等低层路径上,不能依赖 Objective-C 容器对象。 NXMapTable 就是一个 C 接口的轻量哈希表。 它是什么 一个 void * key 到 void * value 的映射表。key 和 value 可以是指针,也可以把整数强转成指针使用。 ...

June 1, 2026

Cocos 引擎 iOS 渲染管线深度解析:从 CADisplayLink 到屏幕呈现

Cocos 引擎 iOS 渲染管线深度解析:从 CADisplayLink 到屏幕呈现 引言 在移动端图形开发中,理解渲染管线的底层实现是走向高级工程师的必经之路。Cocos Creator 作为主流的跨平台游戏引擎,其 iOS Metal 后端的渲染实现采用了现代化的 FrameGraph 架构,结合脏状态追踪、资源池化等优化手段,是一份极佳的学习样本。 本文基于对 Cocos 引擎 gfx-metal 模块的源码分析,梳理从 CADisplayLink 帧回调触发到最终 GPU 呈现的完整渲染链路,并深入解读各阶段的关键实现细节。 整体架构概览 在深入时序之前,先理清核心模块的职责分工: 模块 文件 职责 IOSPlatform IOSPlatform.mm iOS 平台入口,持有 CADisplayLink 驱动渲染循环 RenderPipeline RenderPipeline.cpp 管线编排器,遍历相机并调度 Flow/Stage ForwardFlow ForwardFlow.cpp 前向渲染流程,决定渲染策略 ForwardStage ForwardStage.cpp 前向渲染阶段,收集渲染对象并填充 UBO RenderQueue RenderQueue.cpp 渲染队列,对可渲染对象排序 FrameGraph FrameGraph.cpp 帧图调度器,负责 Pass 编译、排序、合并和执行 CCMTLDevice MTLDevice.mm Metal 设备抽象,管理 Swapchain 和 Queue CCMTLSwapchain MTLSwapchain.mm 交换链,管理 CAMetalLayer 和 drawable CCMTLCommandBuffer MTLCommandBuffer.mm 命令缓冲区封装,核心渲染编码入口 CCMTLRenderCommandEncoder MTLRenderCommandEncoder.h 渲染编码器,含脏状态追踪优化 完整渲染时序图 以下 Mermaid 时序图展示了从屏幕刷新信号到最终呈现的五个阶段: ...

July 8, 2026