首页
沸点
课程
数据标注
HOT
AI Coding
更多
直播
活动
APP
插件
直播
活动
APP
插件
搜索历史
清空
创作者中心
写文章
发沸点
写笔记
写代码
草稿箱
创作灵感
查看更多
登录
注册
Objective-C
项阿丑
创建于2026-02-04
订阅专栏
OC相关知识整理
暂无订阅
共188篇文章
创建于2026-02-04
订阅专栏
默认顺序
默认顺序
最早发布
最新发布
3-27.【OC】【Runtime】forwardingTargetForSelector: 与 forwardInvocation: 的区别是什么?性能上有什
这两个方法分别对应消息转发的第二阶段(快速路径)和第三阶段(慢速路径) 。它们最核心的区别在于:你是只想“转交任务”,还是想“深度干预过程”? 1. 核心区别:控制力与灵活性 forwardingTa
3-26.【OC】【Runtime】消息转发的三阶段分别是什么?
当一个对象无法识别发送给它的消息时,Objective-C Runtime 提供了三道防线来挽救。这三个阶段是由浅入深、性能开销从小到大的过程。如果这三个阶段都走完了仍未处理,程序就会抛出 unrec
3-25.【OC】【Runtime】动态方法解析成功后,是否还会进入消息转发流程?
不会。 如果“动态方法解析”成功(即 resolveInstanceMethod: 或 resolveClassMethod: 返回了 YES),Runtime 会认为该方法现在已经存在,并重新尝试查
3-24.【OC】【Runtime】什么是“动态方法解析”?
“动态方法解析”(Dynamic Method Resolution)是 Objective-C 消息转发机制的第一道防线。 当对象收到一条它无法识别的消息(即在 cache 和方法列表中都没找到对应
3-23.【OC】【Runtime】如果一定要在 Swift 中做类似 Swizzle 的事情,有哪些替代方案?
在 Swift 中需要实现类似 Swizzling 的功能(如全局拦截、日志埋点、行为注入),但又想避开 Objective-C Runtime 的风险,可以根据不同的应用场景选择以下四种主流替代方案
3-22.【OC】【Runtime】Swift 中为什么官方不推荐 Swizzling?
1. 静态派发(Static Dispatch)的性能冲突 Swift 的核心优势之一是执行效率。为了追求极致性能,Swift 编译器会尽可能使用静态派发或 vtable(函数表)派发。 冲突点:Sw
3-21.【OC】【Runtime】Category + Swizzling 同时存在时,调用顺序如何保证?
当 Category(分类) 和 Swizzling(方法交换) 同时出现时,系统的调用逻辑会变得非常微妙。要理清顺序,我们需要将“方法查找机制”和“Swizzling 带来的指针偏移”结合起来看。
3-20.【OC】【Runtime】Swizzling 在继承链中有哪些坑?
在继承链(Inheritance Chain)中进行 Method Swizzling 是最容易导致“幽灵 Bug”的区域。如果不理解父类、子类与方法列表之间的关系,轻则导致功能失效,重则导致全量崩溃
3-19.【OC】【Runtime】多次 Swizzle 同一个方法会发生什么?
多次 Swizzle 同一个方法(通常称为 Nested Swizzling 或 Swizzling Chain)在底层完全行得通,但它像是一场“指针接力赛”,如果逻辑不严密,极易变成“死亡循环”。
3-18.【OC】【Runtime】Swizzling 应该发生在什么时机最安全?
在 Objective-C 中,Method Swizzling 最安全、最标准的时机只有一个:在类的 +load 方法中执行。 1. 为什么是 +load? +load 方法具有以下几个保证安全性的
3-17.【OC】【Runtime】Method Swizzling 的底层原理是什么?到底交换了什么?
Method Swizzling 的本质是利用 Objective-C 的动态性,在运行时(Runtime)修改类对象中 Selector(SEL) 与 Implementation(IMP) 的映射
3-16.【OC】【Runtime】Swift 的方法调用是否也存在类似 Method Cache 的机制?和 OC Runtime 有哪些差异?
Swift 确实有缓存优化,但它的核心机制与 Objective-C 的动态哈希表查找完全不同。 Swift 的设计哲学是**“尽可能静态化”**。为了追求极致性能,它将大部分工作从“运行时”挪到了“
3-15.【OC】【Runtime】objc_msgSendSuper 和 objc_msgSend 在查找起点上有什么区别?
在 Objective-C 中,self 是一个对象指针,而 super 并不是一个真正的对象,它只是一个编译器指令。 它们在底层的区别在于:查找方法时“第一站”在哪里。 1. 查找起点的对比 我们可
3-14.【OC】【Runtime】cache miss 一定会去遍历方法列表吗?还有哪些优化路径?
如果每次 Cache Miss(缓存未命中)都去老老实实地遍历几千个方法的列表,Objective-C 的性能早就崩了。 在进入最慢的“方法列表遍历”之前,Runtime 实际上设计了好几层“减速带”
3-13.【OC】【Runtime】如果一个方法在子类和父类中都存在,cache 是如何区分的?
Cache 是属于“类对象”的私有资产,而不是全局共享的。 Runtime 区分它们并不是靠某个特殊的 ID,而是靠存储的位置。 1. “私有笔记本”原则 在 Objective-C 中,每一个类(S
3-12.【OC】【Runtime】为什么方法第一次调用慢,后续调用会明显变快?
这正是 Objective-C **消息机制(Messaging)**设计的核心精髓。简单来说,第一次调用是在“走流程买票”,后续调用则是“刷脸进场”。 这种性能差异源于 Runtime 架构中 “快
3-11.【OC】【Runtime】Method Cache 的 key 是什么?
在 Objective-C 的 Runtime 源码(以 objc4 为例)中,Method Cache(即 cache_t)本质上是一个哈希表。 简单直接的答案是:Method Cache 的 Ke
3-10.【OC】【Runtime】objc_msgSend 为什么必须写成汇编,而不能是普通 C 函数?
简单来说,objc_msgSend 是 Objective-C 动态性的心脏,它之所以必须用**汇编(Assembly)**编写,是因为它需要挑战 C 语言的极限,完成三件 C 语言几乎“不可能完成的
3-9.【OC】【Runtime】一次方法调用从 objc_msgSend 开始,完整的查找路径是怎样的?
一次方法调用在 Objective-C 中被称为“消息传递”。当执行 [receiver message] 时,底层会转化为 objc_msgSend(receiver, selector)。 为了保
3-8.【OC】【Runtime】Swift 类是否也经过 Objective-C Runtime 的类加载流程?
取决于这个 Swift 类是否继承自 NSObject,以及它如何被调用。 Swift 的类加载机制实际上是一套“双轨制”。为了兼容强大的 Cocoa 生态,它既保留了与 Objective-C Ru
下一页