在 Swift 的闭包(Closure)中使用 和 都是为了解决 循环引用(Retain Cycle) 的问题,但它们在处理对象生命周期的方式上有本质的区别。 以下是详细的对比和使用建议: 1. 核心区别 | 特性 | (弱引用) | (无主引用) | | :--- | :--- | :--- | | 类型 | 可选类型 (Optional),即 | 非可选类型 (Non-Optional),即 | | 引用计数 | 不增加引用计数 | 不增加引用计数 | | 对象释放后的行为 | 如果 被释放,引用自动变为 | 如果 被释放,引用不会变为空,访问它会导致 崩溃 (Crash) | | 代码处理 | 需要解包 (如 ) | 可以直接使用 ,不需要解包 | | 安全性 | 安全。即使对象没了,代码也不会崩 | 不安全。如果对象没了还去访问,程序会崩溃 | --- 2. 代码示例对比 使用 由于 变成了可选类型,你需要处理它可能为 的情况。 使用 你向编译器保证:“当这个闭包执行的时候,self 一定还活着。” --- 3. 何时使用 是安全的? 使用 的黄金法则是:闭包的生命周期 ...