在 Swift 中,(逃逸)和 (非逃逸)的核心区别在于闭包(Closure)的生命周期,即闭包是在函数返回之前执行,还是在函数返回之后才执行。 自 Swift 3 开始,默认情况下,所有的闭包参数都是非逃逸的(@nonescaping)。 以下是详细的对比和解释: --- 1. 非逃逸闭包 (@nonescaping) —— 默认 定义:当闭包作为参数传递给函数,该闭包在函数结束(return)之前就被调用并执行完毕。 生命周期: 1. 传递闭包给函数。 2. 函数内部运行闭包。 3. 函数返回。 4. 闭包销毁。 特点: 性能优化:编译器知道闭包不会在函数外部存活,因此不需要在堆(Heap)上分配内存来存储闭包的上下文,也不需要进行复杂的引用计数管理(Retain/Release),直接在栈(Stack)上处理,速度更快。 无需 :在闭包内部引用 时,不需要显式写 ,也不用担心循环引用(Retain Cycle),因为闭包会在 销毁前就执行完了。 代码示例: --- 2. 逃逸闭包 (@escaping) 定义:当闭包作为参数传递给函数,但在函数返回之后才被调用。闭包“逃”出...