runtime如何实现weak属性

weak 的行为目标

weak 需要满足两点:

  1. 不增加引用计数,不影响对象释放。
  2. 对象释放时,所有 weak 指针自动置为 nil

这背后依赖 runtime 的弱引用表管理机制。

runtime 的核心做法

runtime 内部维护“对象地址 -> weak 引用集合”的映射。当对象即将销毁时,会遍历该集合,把所有 weak 指针位置写成 nil

这就是 weak 读起来“像普通指针”,但释放后不会变成野指针的原因。

为什么 weak 比 assign 安全

assign 不会自动清空。对象释放后,assign 仍指向旧地址,访问就可能崩溃。

weak 因为有统一清理机制,访问结果是 nil,更安全。

使用建议

  • delegate 优先 weak
  • UI 回调链中涉及双向引用时,至少一侧必须 weak
  • 在多线程环境下,弱引用对象可能随时变 nil,使用前要判空。

典型误区

  • 把所有对象都改成 weak,导致对象过早释放。
  • 误以为 weak 绝对线程安全,忽略时序问题。

总结

weak 的关键不是语法,而是 runtime 在对象销毁阶段统一“断开弱引用”。理解这一点,内存语义和崩溃排查都会更清晰。

results matching ""

    No results matching ""

    results matching ""

      No results matching ""