第4章 Runtime与消息机制
Runtime 是 Objective-C 动态特性的核心,面试中围绕 isa 指针、消息转发、Method Swizzling 和 关联对象 四大模块展开。掌握底层原理和实际应用场景,能有效区分初中高级工程师。本章提供结构化问答框架与真实项目模板,助你从容应对高频追问。
消息转发三阶段对比
| 阶段 | 方法名 | 返回值 | 典型应用 |
|---|---|---|---|
| ① 动态方法解析 | +resolveInstanceMethod: |
BOOL |
模拟多继承、动态添加方法 |
| ② 快速转发 | -forwardingTargetForSelector: |
id |
代理模式、消息透传 |
| ③ 完整转发 | -methodSignatureForSelector: + -forwardInvocation: |
NSMethodSignature |
热更新、AOP 拦截 |
🎯 面试问题:请解释 isa 指针的作用以及消息传递机制
📌 面试官考察点
- 是否理解 isa 指针在实例对象 ↔ 类对象 ↔ 元类对象之间的桥梁作用
- 是否了解 ARM64 下 non-pointer isa 的位域优化
- 是否掌握
objc_msgSend的完整查找路径(缓存→方法列表→父类链)
🧩 回答框架
- isa 定义:实例对象的 isa 指向类对象,类对象的 isa 指向元类对象
- 消息入口:
objc_msgSend通过 isa 链定位方法列表 - 查找路径:方法缓存 → 当前类方法列表 → 逐级 superclass 链
- 优化说明:ARM64 下 isa 采用位域存储,合并引用计数与类地址
💬 简短示例回答
isa 指针是实例对象指向类对象的桥梁,Runtime 通过 isa 链定位方法列表。消息传递由 objc_msgSend 驱动,先查缓存,再遍历类方法列表,未找到则沿 superclass 链向上查找。ARM64 下 isa 采用位域优化,将引用计数与类地址合并存储,提升性能。
🔍 可能追问
- isa 在 ARM64 与 armv7 架构下有什么区别?
- 类对象和元类对象的 isa 指向关系是怎样的?
objc_msgSend的尾调用优化是如何实现的?
⚠️ 避坑提醒:不要只回答 "isa 指向类",要补充 non-pointer isa 的位域结构;区分实例方法查找和类方法查找的路径差异(类方法在元类中查找)。
🎯 面试问题:请详细描述 OC 的消息转发机制
📌 面试官考察点
- 是否完整掌握三个转发