我在结构中收集字符串数据。最后,我将该字符串写入文件。结果是4个文件,每个80 MB。但内部它占用了近16 GB(!)的RAM,迫使操作系统进行交换。 (我使用的是Swift 3.0)
struct ActionCMD { // struct!
var cmd = String()
...
mutating func lines(_ text: String, toTheTop: Bool = false) {
if toTheTop { cmd = text + cmd }
else { cmd += text }
}
...
}
知道为什么会这样,以及如何避免?
答案 0 :(得分:1)
它可能与标记为mutating
的方法有关。 Swift中的mutating
方法会将其“更改”应用于ActionCMD
实例的新副本。根据代码的其余部分,您可能会保留所有这些实例。
答案 1 :(得分:0)
首先,如果不知道如何分配和取消分配这些实例,很难告诉您应用程序出了什么问题。您遇到的问题可能与保留周期或收集String数据的方式有关。字符串是一种值类型,因此每次更改时都会产生新的副本,因为写入时复制功能。也就是说,我能给你的最好的建议是让你在使用ObjC和Swift改进内存管理的几个技巧上进行检查good article 。希望这会有所帮助。
答案 2 :(得分:-1)
在C#和Java中,您将使用stringbuilder,因为如果您不添加内容,则每次添加时都会创建一个新字符串。 stringbuilder只分配一次内存。
这个:http://cocoadocs.org/docsets/StringBuilder/似乎是从Java到Swift的端口,还没有测试过,但是你可以尝试一下。
这一个:https://gist.github.com/kristopherjohnson/1fc55e811d944a430289非常糟糕(遗憾的是谷歌的第一个结果)。它不是一个字符串构建器,只是常规方法的包装器。