我有一个弱自我的闭包,我需要确保在执行闭包期间保留self,并在执行完成后通过闭包释放。以前它是由@strongify完成的。在Swift中还有其他方法吗?
答案 0 :(得分:25)
虽然其他答案有效,但另一种选择是使用反引号。这样做就不必定义strongSelf
并允许使用self
而无需解开可选的self。
let c: () -> Void = {
[weak self] in
guard let `self` = self else {
throw NSError(domain: "self was destroyed", code: 1, userInfo: nil)
}
self.doSomethingNonOptionalSelf()
}
答案 1 :(得分:8)
使用局部变量建立对self
的强引用。
let c: () -> Void = {
[weak self] in
// assign unwrapped optional to another variable
guard let strongSelf: TypeOfSelf = self else {
return // or throw an exception, up to you
}
strongSelf.doSomething()
}
答案 2 :(得分:6)
回答一个老问题来提出一个成语我没有看到很多人提出:你可以使用withExtendedLifetime
来保证弱化的self
不会消失在你身上。< / p>
let c: () -> Void = {
[weak self] in
withExtendedLifetime(self) {
self!.doSomething()
}
}
请注意,尽管withExtendedLifetime
保证在完成对其闭包的调用之前不会销毁该参数,但该参数仍然是可选的,因此您必须将其解包。
参考文献: