swift - 为什么转义闭包需要我们明确地引用 self ?
问题描述
Apple 的 Swift 文档说:
使用 @escaping 标记闭包意味着您必须在闭包中显式引用 self 。
var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
completionHandlers.append(completionHandler)
}
func someFunctionWithNonescapingClosure(closure: () -> Void) {
closure()
}
class SomeClass {
var x = 10
func doSomething() {
someFunctionWithEscapingClosure { self.x = 100 }
someFunctionWithNonescapingClosure { x = 200 }
}
}
但我无法理解这背后的原因?
在他的一次斯坦福讲座中(我不记得是哪一个了),Paul Hegarty 说 Swift 通过强迫你写 self 来表明保留周期的可能性。那么在使用转义闭包时是否存在保留周期的可能性?还是有任何其他原因为什么我们必须在标记为转义的闭包中明确引用 self ?
为什么在另一种情况下(非逃逸闭包),没有保留周期的可能性?
提前致谢。
解决方案
Self 用于保留/捕获您要发送消息的对象的实例。如果您不使用 self,那么编译器将不知道将消息发送到哪里
斯坦福讲座是对的,但为什么会发生这种情况?将 self 放入闭包中可能会变成一个引用循环,其中对象永远不会放开。您可以通过使用弱自我或未知自我来避免这种情况。但是,您应该只使用弱自我或未知自我,以避免强引用循环。
让我知道这是否正确回答了您的问题或者您是否需要更多帮助
推荐阅读
- python - PySide 代码产生一个空白窗口。在保持课程的同时有任何解决方案吗?
- reactjs - 按钮的 OnClick 平滑滚动 + 触发功能
- sql-server - SSIS 数据流任务 - 在控制流上旋转很长时间,预执行
- c# - 如何检查列表中的多个元素
- python - 查找由 0 到 n 个单词分隔的两个字符串的最有效的正则表达式是什么?
- django - 如何在 Django 测试中正确结束后台芹菜工作者
- python - 将字符串转换为 json,其中一些值包含在方括号中
- python - Tkinter 应用程序在其他屏幕中移动或通过 ssh 运行时不保持比例
- sql - 表上的 SQL 连接
- node.js - 为什么 Google Cloud Vision API 的节点客户端不考虑纵横比