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
相关产品推荐
相关产品推荐

