swift 应用程序的内存不断增加

Memory continuously increasing on swift application

我正在编写一个通用 Swift 应用程序(不适用于 iOS,稍后将在 运行 raspbian 上编写)并且我注意到内存不断增加。我也用检查员检查了内存泄漏,并且有 none。 为了深入挖掘,我为 macOS 创建了一个空白应用程序,我只是写了那些代码行,仅用于测试:

var array = [Decimal]()

while(true) {
    array = [Decimal]()
    for i in 0..<10000
    {
        array.append(Decimal(string: i.description)!)
    }
    sleep(1)
}

据我所知,在 while 循环的每个循环开始时,应该从内存中删除在前一个循环中填充的整个数组。但似乎这并没有发生,这些代码行进程内存无限增加。

我还在一个 iOS 项目上尝试了相同的代码,将它放在应用程序函数(在应用程序委托开始时调用的函数)上,我注意到在这种情况下,内存仍然存在不变,不上升。

我是否遗漏了非 iOS 项目的某些内容?

Decimal(string:) 正在创建自动释放对象。使用 autoreleasepool 定期排空池:

var array = [Decimal]()

while true {
    autoreleasepool {
        for i in 0..<10_000 {
            array.append(Decimal(string: i.description)!)
        }
        sleep(1)
        array = []
    }
}

通常情况下,当您回到运行循环时,自动释放池会被清空。但在这种情况下,这个 while 循环永远不会返回到 OS,因此池不会被耗尽。使用您自己的 autoreleasepool,如上,可以解决该问题。

FWIW,Apple 一直在慢慢删除 Foundation/Cocoa 类 中自动释放对象的使用。 (我们过去遇到这个问题的 Foundation objects/APIs 比现在多得多。)显然 Decimal(string:) 仍然在幕后创建自动释放对象。在大多数实际情况下,这不是问题,但在您的示例中,您需要引入自己的 autoreleasepool 以减轻此 while 循环中的这种行为。