什么是在swift中使用strongSelf的正确方法?

Гол*_*ген 9 closures automatic-ref-counting swift

在非平凡块中的Objective-C中,我注意到了weakSelf/strongSelf的使用.

在Swift中使用strongSelf的正确方法是什么?就像是:

if let strongSelf = self {
  strongSelf.doSomething()
}
Run Code Online (Sandbox Code Playgroud)

因此,对于每个包含self的闭包,我应该添加strongSelf检查?

if let strongSelf = self {
  strongSelf.doSomething1()
}

if let strongSelf = self {
  strongSelf.doSomething2()
}
Run Code Online (Sandbox Code Playgroud)

有没有办法让上述更优雅?

Max*_*Max 26

使用strongSelf是一种检查self不等于nil的方法.当你有一个可能在将来某个时候被调用的闭包时,重要的是传递一个weakself实例,这样你就不会通过保持对已经去初始化的对象的引用来创建一个保留周期.

{[weak self] () -> void in 
      if let strongSelf = self {
         strongSelf.doSomething1()
      }
}
Run Code Online (Sandbox Code Playgroud)

从本质上讲,如果自我不再存在,则不要持有对它的引用,也不要对它执行操作.


Cru*_*ruz 6

另一种weak self不使用的方式strongSelf

{[weak self] () -> void in 
      guard let `self` = self else { return }
      self.doSomething()
}
Run Code Online (Sandbox Code Playgroud)

  • 我爱这个但要小心.Chris Lattner特别声明这是一个编译器错误https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160118/007425.html (8认同)

GoZ*_*ner 5

您的使用strongSelf似乎是针对仅在不为零的情况下调用该doSomethingN()方法self。相反,使用可选方法调用作为首选方法:

self?.doSomethingN()
Run Code Online (Sandbox Code Playgroud)