swift - DateFormatter 中的内存泄漏

标签 swift memory-leaks dateformatter

我经常在代码中使用 DateFormatter 并且没有发现任何问题,但后来我决定测试一个类进行大量迭代 - 我注意到一个巨大的内存泄漏。

泄漏的原因是 DateFormatter

简单代码:

var dateFormatter:DateFormatter
dateFormatter = DateFormatter()
let date : Date = Date()
for _ in 1...100000000 {
    _ = dateFormatter.string(from: date)
}

无泄漏。每个进程在整个运行时间内5.9 MB

但是当我使用dateFormat时:

var dateFormatter:DateFormatter
dateFormatter = DateFormatter()
let date : Date = Date()
dateFormatter!.dateFormat = "yyyyMMddHHmmssSSS"
for _ in 1...100000000 {
    _ = dateFormatter.string(from: date)
}

运行结束时使用内存4 GB

如果我使用:

dateFormatter.dateFormat = "yyyyMMdd"

无泄漏。

如果我使用:

dateFormatter.dateFormat = "yyyyMMddHH"

泄漏。

最佳答案

在第一个示例中,您正在创建零长度字符串。修改您的代码以打印它们;您在日志中看不到任何内容。尝试将日期格式化程序的输出分配给一个变量,并通过在循环中放置断点来检查其值;该值始终为空字符串。这可以解释为什么内存使用量仍然如此低。

在第二个示例中,您按照日期格式创建字符串。和以前一样,检查日期格式化程序中的值,您就会看到。这解释了为什么您会 swift 耗尽物理 RAM:您在该循环中创建了 1 亿个非空字符串。

即使在第一个示例中,这也不是最佳实践。有可能,如果您确实需要 1 亿个字符串,您可以对它们做一些事情,例如将它们放入在其他地方实例化的数组中,或者诸如此类。您不想让它们在那个巨大的循环中积累。

这是代码的修改版本:

    let date = Date()

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyyMMddHHmmssSSS"

    for _ in 1...100000000 {
        autoreleasepool(invoking: { () -> () in
            let string = dateFormatter.string(from: date)
            print("\(string)")
        })
    }

请注意,我在循环中使用了 autoreleasepool 闭包。这确保了我在循环的每次传递中创建的字符串在下一次迭代之前被释放。在该闭包内,您可以对该字符串执行任何您想要的操作。您可以在其中创建任意数量的值,并且它们都将在循环的下一次迭代之前被释放。在我的机器上,一切都在消耗 16.2 MB 的内存。您的里程可能会有所不同。

祝您工作顺利。

关于swift - DateFormatter 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57226816/

相关文章:

ios - 我在旧项目中收到错误 No such module 'Realm' 但在新项目中没有错误 - Swift

java - Wildfly 10 内存泄漏问题

jsp - tomcat - 它们之前运行的类仍在内存中加载

python - 使用 matplotlib 绘制两行标签贴

swift - 如何解决 ios swift 中的 XMLParser.ErrorCode.invalidCharacterError ?

swift - 使用 HanekeSwift,屏幕外单元格的网络请求会自动取消吗?

java - java日期格式不正确

ios - 日期格式化程序不从应用程序中的字符串返回日期,但可以在 Playground 上工作

swift - NSXMLParser contentsOfURL 与数据

javascript:删除关联数组的所有对象元素