runtime具体应用
什么时候该用 runtime
runtime 适合“需要动态能力”的场景,而不是常规业务逻辑。常见应用包括埋点注入、模型映射、方法交换、关联对象扩展。
典型应用1:关联对象
当你不能直接改类定义(如系统类)但又想加属性时,可用关联对象:
objc_setAssociatedObjectobjc_getAssociatedObject
常用于给 UIViewController 增加埋点标识、页面参数等。
典型应用2:方法交换(swizzling)
通过交换实现实现 AOP 风格能力,如统一日志、页面曝光统计。
实践原则:
- 只在
+load且配合dispatch_once - 调用原实现,避免破坏系统行为
- 为交换逻辑加开关,便于回滚
典型应用3:消息转发
用于兼容旧接口、桥接多实现对象或降级兜底。适合框架层,不建议在业务层大量使用。
风险点
- 可读性下降,调试成本上升
- 系统版本升级后兼容风险增加
- 不当 swizzling 容易引发不可预期副作用
工程建议
- runtime 代码集中到基础组件层
- 写清注释和单元测试
- 对关键注入点保留开关
总结
runtime 是“能力放大器”,也是“复杂度放大器”。把它用在真正需要动态能力的边界位置,收益才会大于风险。