runtime如何实现weak属性
weak 的行为目标
weak 需要满足两点:
- 不增加引用计数,不影响对象释放。
- 对象释放时,所有 weak 指针自动置为
nil。
这背后依赖 runtime 的弱引用表管理机制。
runtime 的核心做法
runtime 内部维护“对象地址 -> weak 引用集合”的映射。当对象即将销毁时,会遍历该集合,把所有 weak 指针位置写成 nil。
这就是 weak 读起来“像普通指针”,但释放后不会变成野指针的原因。
为什么 weak 比 assign 安全
assign 不会自动清空。对象释放后,assign 仍指向旧地址,访问就可能崩溃。
weak 因为有统一清理机制,访问结果是 nil,更安全。
使用建议
delegate优先weak。- UI 回调链中涉及双向引用时,至少一侧必须
weak。 - 在多线程环境下,弱引用对象可能随时变
nil,使用前要判空。
典型误区
- 把所有对象都改成
weak,导致对象过早释放。 - 误以为
weak绝对线程安全,忽略时序问题。
总结
weak 的关键不是语法,而是 runtime 在对象销毁阶段统一“断开弱引用”。理解这一点,内存语义和崩溃排查都会更清晰。