ios - 当 Swift 中隐式捕获 "self"时,我可以触发编译器警告吗

标签 ios swift swift2

如果我有一些需要闭包的代码,并且 self 被隐式捕获,我可以让它引起编译器警告吗?我可以为此向编译器命令添加一些标志吗?

最佳答案

不完全是。但是有一些东西可以解决您可能想要此警告的原因 — 以防止捕获 self 的闭包可能导致保留周期的情况...

当闭包作为参数传递给函数但在函数返回后使用时,在闭包中捕获 self 的潜在保留循环出现 - 即闭包的生命周期 (以及其中捕获的任何内容)“逃脱”了编写它的上下文。当闭包逃逸时,它必须确保它仍然可以访问它使用的东西(比如 self 及其任何属性或方法),所以我们进入内存管理和可能的保留周期,[weak self]/strongSelf

no escape 1953 no escape 1994

使用@noescape,您可以声明作为参数传递给函数的闭包不会逃逸调用上下文,因此不需要额外的内存管理开销来进行闭包。并且编译器可以应用一些其他优化,使您的函数及其关闭速度更快。

func someFunctionWithNoescapeClosure(@noescape closure: () -> Void) {
    closure()
}

@noescape 闭包中,您可以访问 self 上的方法/属性,而无需显式编写 self.,因为您不是捕获 self 了。而且,一旦你标记了一个参数 @noescape,如果你试图做任何允许它逃逸的事情(比如,从参数中获取闭包并将其分配给存储的属性),你会得到编译器错误(不仅仅是警告)。

有关 Apple 的完整文章,请参阅 Nonescaping ClosuresThe Swift Programming Language 中。和 this post提供了一个可以进一步解释事情的替代视角。

关于ios - 当 Swift 中隐式捕获 "self"时,我可以触发编译器警告吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34641567/

相关文章:

arrays - TableView 仅显示从 Firebase 读取的部分数据

ios - Swift 4 GoogleMaps 添加 UIToolBar/make map "smaller"以适应其他 UI 元素

json - 如何使用 Codable 协议(protocol)快速构建 json 对象模型

swift - JSONObjectWithData错误: unexpectedly found nil while unwrapping an Optional value

ios - 如何使用应用内按钮将 ReplayKit 视频保存到相机胶卷

ios - 首次使用或应用进入后台时下载失败

ios - 是否可以为 iOS 编写家长控制应用程序?

ios - iPhone 5 上的 SceneKit 和 CoreMotion "lagging"但在 iPhone 6 上正常

ios - UITextView 文本被截断 - iOS 10

iOS 更改按钮图像以填满 iphone 3.5 英寸和 iphone 4 英寸的屏幕