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

时间:2014-11-15 01:12:40

标签: memory-management swift

我有一个弱自我的闭包,我需要确保在执行闭包期间保留self,并在执行完成后通过闭包释放。以前它是由@strongify完成的。在Swift中还有其他方法吗?

3 个答案:

答案 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保证在完成对其闭包的调用之前不会销毁该参数,但该参数仍然是可选的,因此您必须将其解包。

参考文献:

  1. Swift Standard Library Functions
  2. The Weak/Strong Dance in Swift