一尘不染

阻止Swift中的保留周期?

swift

传统上,在Objc中,我们会执行weakSelf来防止块的额外保留计数。

swift如何在内部管理Objc块中发生的保留周期?


阅读 185

收藏
2020-07-07

共1个答案

一尘不染

为防止块对对象的强烈引用,必须为块定义捕获列表。

闭包表达式的语法定义如下:

{ ( /*parameters*/ ) -> /*return type*/ in

    // statements
}

但这会在文档的后面进行扩展以包括捕获列表。这实际上等效于如下定义的表达式语法:

{ [ /*reference type*/ /*object*/, ... ] ( /*parameters*/ ) -> /*return type*/ in

    // statements
}

…在哪里/*reference type*/可以是weakunowned

捕获列表是出现在闭包中的第一件事,它是可选的。如上所示,语法定义为一对或多对引用类型,后跟对象;每对之间用逗号分隔。例如:

[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)
}
2020-07-07