您可以使用 Swift ARC 快速释放稀有资源(文件描述符、网络套接字)吗?

can you use Swift ARC for prompt deallocation of scarce resources (file descriptors, network sockets)?

假设您正在编写一个接收大量套接字连接的服务器,并且您希望确保在不再需要套接字或出现异常时立即关闭套接字。

能否借用Swift的ARC,将资源包装在一个对象中,并在deinitialize()方法中解除分配,有效实现稀缺资源的快速解除分配?

是否可以将 "defer" 关键字用于相同的目的,一种方法优于另一种方法吗?

回答我自己的问题:

知道Swift使用与Objective-C相同的ARC实现,答案是不建议依赖ARC来释放稀缺资源。

Apple 建议不要在此处以这种方式使用 ARC:

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html#//apple_ref/doc/uid/TP40004447-SW13

陈述的原因是(从文档中复制):

  • 对象图拆卸的顺序依赖性。 对象图拆卸机制本质上是无序的。尽管您通常可能期望并获得特定订单,但您正在引入脆弱性。例如,如果一个对象意外地自动释放而不是释放,则拆卸顺序可能会改变,这可能会导致意外的结果。

  • 非回收稀缺资源 内存泄漏是应该修复的错误,但它们通常不会立即致命。但是,如果稀缺资源没有在您期望它们被释放时被释放,您可能 运行 会陷入更严重的问题。例如,如果您的应用程序 运行 没有文件描述符,用户可能无法保存数据。

  • 清理逻辑在错误的线程上执行。 如果一个对象在意外的时间被自动释放,它将在它恰好所在的任何线程的自动释放池块上被释放。这对于应该只从一个线程接触的资源来说很容易是致命的。

另一方面,"defer" 关键字表示在 defer 子句下编写的指令将在当前函数的堆栈展开时执行。这具有 C++ RAII 的效果,它使您能够将稀缺资源的生命周期与堆栈上值的生命周期联系起来。