Swift 面试题
目录

Swift 中什么是非逃逸闭包 (@nonescaping)?

· 约 2 分钟读完 · 第 48 / 196 章

推荐答案

在 Swift 中,非逃逸闭包(@nonescaping)是指闭包在函数执行期间被调用,并且在函数返回之前完成执行。这意味着闭包不会在函数返回后被保留或调用。非逃逸闭包是 Swift 中闭包的默认行为,通常用于同步操作。

本题详细解读

1. 非逃逸闭包的定义

非逃逸闭包是指闭包的生命周期不会超过函数的执行周期。换句话说,闭包在函数执行期间被调用,并且在函数返回之前完成执行。这种闭包不会在函数返回后被保留或调用。

2. 非逃逸闭包的特点

  • 默认行为:在 Swift 中,闭包默认是非逃逸的。这意味着如果你没有显式地标记闭包为逃逸闭包(@escaping),那么它就是非逃逸闭包。
  • 性能优化:非逃逸闭包允许编译器进行更多的优化,因为它知道闭包不会在函数返回后被调用。
  • 内存管理:非逃逸闭包不会导致内存泄漏,因为它们在函数返回后不会被保留。

3. 非逃逸闭包的使用场景

非逃逸闭包通常用于同步操作,例如在函数内部执行一些操作并立即返回结果。以下是一个简单的示例:

在这个例子中,completion 闭包是非逃逸的,因为它会在 performOperation 函数返回之前被调用。

4. 非逃逸闭包与逃逸闭包的区别

  • 非逃逸闭包:闭包在函数执行期间被调用,并且在函数返回之前完成执行。
  • 逃逸闭包:闭包可能在函数返回后被调用,因此需要显式标记为 @escaping。

5. 示例代码

以下是一个非逃逸闭包的示例:

在这个例子中,closure 是一个非逃逸闭包,因为它会在 nonEscapingClosure 函数返回之前被调用。