ios - 你能使用 Swift ARC 快速释放稀缺资源(文件描述符、网络套接字)吗?

标签 ios swift sockets automatic-ref-counting raii

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

能否借助 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

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

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

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

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

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

关于ios - 你能使用 Swift ARC 快速释放稀缺资源(文件描述符、网络套接字)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33685060/

相关文章:

android java和套接字

Java Socket - 服务器没有响应

iphone - 使用 JSONKit 在 iOS 中解析 JSON 数组 - 没有 ObjectForKey 标签的数组?

ios Swift 弹出自定义 View ,无论当前 View Controller 如何,每 30 分钟一次

ios - 如何快速获得这个周末约会?

sockets - Golang 中的套接字调试器

ios - 如何在不加载图像文件的情况下获取图像文件的图像大小?

ios - swift 3 : How to get language code from a country code?

ios - 有没有办法快速从 vImage_Buffer 获取像素格式信息?

ios - 编写简单的api调用测试