【问题标题】:Why does elementary Swift code cause memory leaks?为什么基本的 Swift 代码会导致内存泄漏?
【发布时间】:2021-01-18 14:57:19
【问题描述】:
import Foundation

let path = "/Users/user/file.swift"
while (true) {
    let _ = path.components(separatedBy: "/")
}

我们如何防止这种情况发生?

代码当然是演示。

【问题讨论】:

    标签: swift memory-leaks


    【解决方案1】:

    此代码不会泄漏。它只是(可能)永远积累内存,因为您永远不会通过耗尽自动释放池来释放它。您可以通过使用 @autoreleasepool 创建自己的自动释放池块来解决此问题:

    while (true) {
        @autoreleasepool {
            let _ = path.components(separatedBy: "/")
        }
    }
    

    池通常在事件循环结束时自动排空,但这段代码永远不会到达那个点,因此它需要创建和释放自己的池。

    上面的“(可能)”是因为它取决于优化器设置以及有关components(separatedBy:) 当前实现方式的详细信息。在许多情况下,优化器会自动处理自动释放的对象。

    有关自动释放池块的更多信息,请参阅高级内存管理编程指南中的Using Autorelease Pool Blocks。有关 Cocoa 内存管理的更多背景信息(以及 autorelease 的含义),请参阅该指南的其余部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      • 2016-04-12
      • 2013-07-12
      • 1970-01-01
      • 2017-02-13
      相关资源
      最近更新 更多