如果我有一些需要闭包的代码,并且 self
被隐式捕获,我可以让它引起编译器警告吗?我可以为此向编译器命令添加一些标志吗?
最佳答案
不完全是。但是有一些东西可以解决您可能想要此警告的原因 — 以防止捕获 self
的闭包可能导致保留周期的情况...
当闭包作为参数传递给函数但在函数返回后使用时,在闭包中捕获 self
的潜在保留循环出现 - 即闭包的生命周期 (以及其中捕获的任何内容)“逃脱”了编写它的上下文。当闭包逃逸时,它必须确保它仍然可以访问它使用的东西(比如 self
及其任何属性或方法),所以我们进入内存管理和可能的保留周期,[weak self]
/strongSelf
等
使用@noescape
,您可以声明作为参数传递给函数的闭包不会逃逸调用上下文,因此不需要额外的内存管理开销来进行闭包。并且编译器可以应用一些其他优化,使您的函数及其关闭速度更快。
func someFunctionWithNoescapeClosure(@noescape closure: () -> Void) {
closure()
}
在 @noescape
闭包中,您可以访问 self
上的方法/属性,而无需显式编写 self.
,因为您不是捕获 self
了。而且,一旦你标记了一个参数 @noescape
,如果你试图做任何允许它逃逸的事情(比如,从参数中获取闭包并将其分配给存储的属性),你会得到编译器错误(不仅仅是警告)。
有关 Apple 的完整文章,请参阅 Nonescaping Closures在 The Swift Programming Language 中。和 this post提供了一个可以进一步解释事情的替代视角。
关于ios - 当 Swift 中隐式捕获 "self"时,我可以触发编译器警告吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34641567/