在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。

你应该特别注意weakunowned的区别。 在你的实现中使用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() }