如何实现与Swift中的strongify相同的行为?

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)


yli*_*x81 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()
}
Run Code Online (Sandbox Code Playgroud)

  • 好主意,但代码可能更好.一个弱的`self`自动是一个可选的,并且将它分配给一个(隐式强)本地使得local也是可选的.既然你无论如何都要测试非零,你可以用`if let`语句更简洁. (3认同)

Pal*_*tim 6

回答一个古老的问题,提出一个成语,我没有看到很多人提起:你可以withExtendedLifetime用来保证弱者self不会消失在你身上.

let c: () -> Void = {
        [weak self] in
        withExtendedLifetime(self) {
            self!.doSomething()
        }
}
Run Code Online (Sandbox Code Playgroud)

请注意,虽然withExtendedLifetime保证在调用其闭包之前不会销毁参数,但参数仍然是可选的,因此您必须将其解包.

参考文献:

  1. Swift标准库函数
  2. 斯威夫特的弱/强舞