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
循环中的这种行为。
我正在编写一个通用 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
循环中的这种行为。