为什么在 swift 中创建字符串时会发生内存泄漏?

Why is there a memory leak at String creation in swift?

泄漏是一个根泄漏,在这个图像中在同一条线上被多次引起,但下面还有一个被称为单次并且也产生泄漏.

这是 调用前面所述的代码行之后的调用堆栈。

这是 class Instruments 发现泄漏的位置:

class Item {
 var id: String!
 var name: String!

 internal init(name: String) {
    self.name = name
    self.id = name
 }

 var description: String {
    return "(\(id)) \(name)"
 }
}

在包含 return "(\(id)) \(name)" 的计算变量 description 行检测到泄漏,将 description 更改为:

var description: String {
    return "(" + id + ") " + name
}

更新:

var description: String {
    if let id = self.id as? String, let name = self.name as? String {
        return "(\(id)) \(name)"
    }
    return "NO AVAILABLE DESCRIPTION"
}

The last one emits a "Conditional cast from 'String!' to String always succeeds".

So, even this looks like a hack.

为什么会导致泄漏?

我测试了你的代码并经历了几个线程,我的理解是你必须使用可选绑定 if let 子句,当使用字符串插值而不是直接使用可选变量时。对于String拼接,直接使用optionals是没有问题的。问题出在插值上。

var description: String {
    if let id = self.id, let name = self.name {
        return "(\(id)) \(name)"
    }
    return "NO AVAILABLE DESCRIPTION"
}

您可以在此处获得更多信息 memory leak in Swift String interpolation。 似乎是一个错误,可能会在未来的版本中解决。