Swift 中的 [something] 语法在使用闭包时意味着什么?

What does the [something] syntax in Swift mean when working with closures?

通常在闭包中捕获对 属性 的引用时,我会做这样的事情 -

foo { [weak self] in
    self?.bar()
}

不过我也看到这个写成-

foo { [bar] in
    bar()
}

[bar] 是什么意思,这与捕获 weak self 有何不同?

[bar] 部分是 capture list

它指示闭包应该如何捕获值。当您在关键字 in 之前的括号中输入变量时,闭包不再引用原始变量,而是在闭包块中创建自己的副本。

那是一个捕获列表,which can be used to resolve strong reference cycles。 如果闭包通过引用捕获变量(它对所有引用类型都这样做),则闭包可以通过成为最后一个持有对捕获变量的引用的对象来创建强引用循环。

一个weak引用意味着它不会增加对象的引用计数,所以如果对象的最后一个引用是弱引用,它的引用计数为0,因此ARC将释放它.这对于转义闭包特别有用,闭包的生命周期可能比 referenced/captured 对象的生命周期长,因此闭包最终可能持有对该对象的最后引用,因此不允许 ARC 释放它。