为什么基本的Swift代码会导致内存泄漏?
import Foundation
let path = "/Users/user/file.swift"
while (true) {
let _ = path.components(separatedBy: "/")
}
我们如何防止这种情况发生?
当然,代码是演示。
回答
此代码不会泄漏。它只是(可能)永远累积内存,因为您永远不会通过排空自动释放池来释放它。您可以通过使用以下命令创建自己的自动释放池块来解决此问题@autoreleasepool:
while (true) {
@autoreleasepool {
let _ = path.components(separatedBy: "/")
}
}
该池通常在事件循环结束时自动排空,但这段代码永远不会到达那个点,因此它需要创建和释放自己的池。
上面的“(可能)”是因为它取决于优化器设置和有关components(separatedBy:)当前实现方式的详细信息。在许多情况下,优化器会自动处理自动释放的对象。
有关自动释放池块的更多信息,请参阅高级内存管理编程指南中的使用自动释放池块。有关 Cocoa 内存管理的更多背景信息(以及自动释放的含义),请参阅该指南的其余部分。