假设您正在编写一个接收大量套接字连接的服务器,并且您希望确保在不再需要套接字或出现异常时立即关闭套接字。
能否借助 Swift 的 ARC 将资源包装在一个对象中,并在 deinitialize() 方法中释放它,从而有效地实现快速稀缺资源释放?
是否可以将“defer”关键字用于相同的目的,一种方法优于另一种方法吗?
最佳答案
回答我自己的问题:
知道 Swift 使用与 Objective-C 相同的 ARC 实现,答案是不建议依赖 ARC 来释放稀缺资源。
Apple 建议不要在此处以这种方式使用 ARC:
陈述的原因是(从文档中复制):
对对象图拆卸的顺序依赖。 对象图拆卸机制本质上是无序的。尽管您通常可能期望并获得特定订单,但您正在引入脆弱性。例如,如果某个对象意外地自动释放而不是释放,则拆卸顺序可能会发生变化,这可能会导致意外结果。
不回收稀缺资源。 内存泄漏是应该修复的错误,但它们通常不会立即致命。但是,如果稀缺资源在您期望它们被释放时没有被释放,您可能会遇到更严重的问题。例如,如果您的应用程序用完了文件描述符,用户可能无法保存数据。
清理逻辑在错误的线程上执行。 如果一个对象在意外时间自动释放,它将在它恰好所在的任何线程的自动释放池 block 上被释放。这对于只应从一个线程接触的资源来说很容易是致命的。
另一方面,“defer”关键字表示在 defer 子句下编写的指令将在当前函数的堆栈展开时执行。这具有 C++ RAII 所具有的效果,它使您能够将稀缺资源的生命周期与堆栈上值的生命周期联系起来。
关于ios - 你能使用 Swift ARC 快速释放稀缺资源(文件描述符、网络套接字)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33685060/