在逻辑上无主,相当于弱!在斯威夫特

Jov*_*ski 8 xcode ios automatic-ref-counting swift

这些块总是会在相同的情况下失败(当关闭被执行但是自我被解除分配时)?

{ [unowned self] in
    //use self
    self.number = self.number + 1
}

{ [weak self] in
    //use self!
    self!.number = self!.number + 1
}
Run Code Online (Sandbox Code Playgroud)

San*_*eep 4

无主引用不会保留对 self 的强引用,但它假设该对象始终具有某个值(不是 nil),并且如果 self 在执行块时以某种方式释放,则上述代码会崩溃。

对于弱的情况,如您的示例所示,弱是块内的可选类型,因此也可能有一个值,也可能为零。您有责任检查该值是否存在并调用其方法。如上所述,如果您使用展开运算符(!),当 self 被释放时,它肯定会崩溃。因此,如果块仍在执行并且 self 同时被释放,则两个版本的代码都会崩溃。

因此,我建议使用弱来通过可选检查来保护此类崩溃,

{ [weak self] in
    if let me = self {
       me.number = me.number + 1
    }
}
Run Code Online (Sandbox Code Playgroud)