You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中unowned var something: Something!与weak var something: Something!的区别

unowned 与 weak 修饰属性的核心差异

先看给出的Swift代码片段:

protocol Something: AnyObject { 
    func f()
}

class A {
    unowned var something1: Something!
    weak var something2: Something!

    func f() {
        something1.f()
        something2.f()
    }
}

两者的关键差异集中在引用失效后的行为、可选性要求和使用风险上:

  • 引用销毁后的状态
    • weak修饰的something2:当它引用的Something对象被销毁时,系统会自动将something2置为nil——这也是weak必须修饰可选类型的原因(哪怕是隐式解包可选!)。
    • unowned修饰的something1:对象销毁后,这个变量不会被置为nil,会变成悬垂引用,指向已经被释放的内存地址。
  • 访问风险
    • 访问something2时,最多因为隐式解包nil导致崩溃,但如果改成普通可选?,还能通过if let或guard let安全判断是否有效。
    • 访问something1时,如果原对象已销毁,会直接触发野指针错误导致崩溃,而且无法提前检测这个引用是否有效,因为它永远不会是nil。
  • 适用场景
    • weak适合对象生命周期不绑定的场景:比如视图和代理的关系,代理对象可能比视图先销毁,或者反过来。
    • unowned适合确定被引用对象生命周期绝对长于引用者的场景:比如一个订单对象引用所属用户,能保证用户不会在订单之前被销毁。

内容的提问来源于stack exchange,提问作者Roman Podymov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 22:52:11