在Swift中保留循环?
传统上在Objc,我们做weakSelf来防止块的额外保留计数。
swift如何在Objc中pipe理保留周期?
为了防止块保持对对象的强引用,您必须为该块定义捕获列表。
闭包expression式的语法定义如下:
{ ( /*parameters*/ ) -> /*return type*/ in // statements }
但后来在文档中扩展了一个捕获列表。 这有效地等同于如下定义的expression式语法:
{ [ /*reference type*/ /*object*/, ... ] ( /*parameters*/ ) -> /*return type*/ in // statements }
其中/*reference type*/
可以weak
或不unowned
。
捕获列表是第一个出现在闭包中,它是可选的。 上面的语法定义为一对或多对引用types,后跟对象; 每对用逗号分隔。 例如:
[unowned self, weak otherObject]
完整的例子:
var myClosure = { [unowned self] in print(self.description) }
请注意, unowned
引用是非可选的,所以你不需要打开它。
希望能回答你的问题。 你可以在文档的相关部分阅读更多关于Swift的ARC。
你应该特别注意weak
和unowned
的区别。 在你的实现中使用weak
可能会更安全,因为使用unowned
假定对象永远不会为零。 这可能会导致您的应用程序崩溃,如果对象实际上已被释放,然后在您的closures中使用。
使用weak
作为参考types,你应该打开?
, 如下:
var myClosure = { [weak self] in print(self?.description) }
唯一让我俘获名单的是什么时候使用弱与无主。
这本书将其归结为这些规则:
如果自我可能在封闭使用[弱自我]。
如果封闭使用[无主的自我],自我永远不会成为零。
有关更深入的解释,请参阅Swift编程语言手册中的 Weak和Unwired引用部分。
如上所述,在Swift中有两种避免保留周期的可能性,如下所述:
var sampleClosure = { [unowned self] in self.doSomething() }
self
永远不可能是nil
。
var sampleClosure = { [weak self] in self?.doSomething() }
self
需要解开使用?
。 这里有一个重要的观察要做,如果有更多的指令使用自己,可以分享结果等,一个可能的正确的方法可以是:
var sampleClosure = { [weak self] in if let this = self{ this.doSomething() this.doOtherThings() } }
要么
var sampleClosure = { [weak self] in guard let strongSelf = self else{ return } strongSelf.doSomething() strongSelf.doOtherThings() }