Nik*_*nov 15 memory-management swift
我有一个弱自我的闭包,我需要确保在执行闭包期间保留self,并在执行完成后通过闭包释放.以前它是由@strongify完成的.在Swift中还有其他方法吗?
Rya*_*sus 26
虽然其他答案有效,但另一种选择是使用反引号.这样做不需要定义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()
}
Run Code Online (Sandbox Code Playgroud)
使用局部变量建立强引用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()
}
Run Code Online (Sandbox Code Playgroud)
回答一个古老的问题,提出一个成语,我没有看到很多人提起:你可以withExtendedLifetime
用来保证弱者self
不会消失在你身上.
let c: () -> Void = {
[weak self] in
withExtendedLifetime(self) {
self!.doSomething()
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,虽然withExtendedLifetime
保证在调用其闭包之前不会销毁参数,但参数仍然是可选的,因此您必须将其解包.
参考文献: