传统上,在Objc中,我们会执行weakSelf来防止块的额外保留计数。
swift如何在内部管理Objc块中发生的保留周期?
为防止块对对象的强烈引用,必须为块定义捕获列表。
闭包表达式的语法定义如下:
{ ( /*parameters*/ ) -> /*return type*/ in // statements }
但这会在文档的后面进行扩展以包括捕获列表。这实际上等效于如下定义的表达式语法:
{ [ /*reference type*/ /*object*/, ... ] ( /*parameters*/ ) -> /*return type*/ in // statements }
…在哪里/*reference type*/可以是weak或unowned。
/*reference type*/
weak
unowned
捕获列表是出现在闭包中的第一件事,它是可选的。如上所示,语法定义为一对或多对引用类型,后跟对象;每对之间用逗号分隔。例如:
[unowned self, weak otherObject]
完整的例子:
var myClosure = { [unowned self] in print(self.description) }
请注意,unowned引用是非可选的,因此您无需解开引用。
希望能回答您的问题。您可以在文档的相关部分中详细了解Swift中的ARC 。
您应特别注意weak和之间的区别unowned。使用可能会更安全weak,因为using unowned假设该对象永远不会为nil。如果对象在关闭中被使用之前实际上已经被释放,则可能导致您的应用程序崩溃。
使用weak作为参考类型时,您应使用来取消包装?,如下所示:
?
var myClosure = { [weak self] in print(self?.description) }