理解 Swift 逃逸闭包与 implicit `self`
——读懂 Xcode 的 “Capture self
explicitly to enable implicit self
in this closure” 报错
1 · 什么是「逃逸闭包」?
在 Swift 中,当一个闭包可能在其所在函数返回之后才被执行时,就称它为逃逸闭包(escaping closure)。
你必须在参数类型前写 @escaping
来显式宣示这一点,例如:
func loadData(completion: @escaping (Result<Data, Error>) -> Void) {// completion 可能在异步网络回调中被调用
}
这是因为逃逸闭包会被某个对象持有,可能形成引用环或延迟释放;标注让编译器和开发者都能及早注意到内存管理风险。(docs.swift.org)
快速判断:如果闭包被存储到属性 / 变量里,或被异步 API(如 GCD、URLSession)保存后稍后执行——它就是逃逸的。(