编程Swift程序员

什么是Swift中的'defer'?它是如何工作的,为什么使用它,有哪些非标准的使用场景?

用 Hintsage AI 助手通过面试

答案。

运算符**defer**延迟执行代码,直到退出当前作用域,通常是从函数中返回。它方便用于清理资源、关闭文件和释放内存——即所谓的自动清理。

特点:

  • defer块的执行顺序与声明顺序相反(LIFO)。
  • 调用总是会发生——无论是正常退出函数,还是抛出错误。
  • 有助于避免清理代码的重复,并支持函数的清晰架构。

示例:

func processFile() { let file = openFile() defer { closeFile(file) } // 处理文件 // 即使在throw或return情况下,file也会被关闭 }

**非典型用法:**部分模拟'finally'类型的结构,代码分组以进行日志记录和跟踪运行时间。

有陷阱的问题。

如果应用程序在执行函数过程中结束,defer会执行吗?

— 不会。Defer仅在正常结束作用域时执行(return、throw或正常退出)。如果应用程序异常终止(例如,由于SIGKILL信号或fatalError),defer块将无法执行。

示例:

func foo() { defer { print("清理") } fatalError("崩溃!") // defer不会执行 }

由于不了解主题细节而导致的实际错误示例。


故事

一个与套接字打交道的函数在throw时没有清理连接。数据悬留,连接没有释放。引入defer后,一切正常:资源总是被关闭。


故事

开发人员试图依赖defer释放全局状态。发生fatalError时资源未释放,导致服务阻塞和需要重启。


故事

在函数中声明了几个defer,认为它们会按照声明顺序执行。结果,资源以错误的顺序关闭(例如,首先关闭了文件描述符,然后试图访问它)。解决方案:牢记defer块的LIFO执行顺序。