为什么在swift中创建String时会出现内存泄漏?

Hug*_*nso 23 memory-leaks swift

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

在此输入图像描述

这是调用之前声明的代码行之后的调用堆栈.

在此输入图像描述

这是仪器泄漏所在的类:

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

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

 var description: String {
    return "(\(id)) \(name)"
 }
}
Run Code Online (Sandbox Code Playgroud)

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

var description: String {
    return "(" + id + ") " + name
}
Run Code Online (Sandbox Code Playgroud)

更新:

要么

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

最后一个发出"来自'字符串的条件转换!' to String总是成功".

所以,即使这看起来像一个黑客.

为什么会导致泄漏?

Ami*_*t89 9

我测试了你的代码并经历了几个线程,我的理解是你必须使用可选的绑定if let子句,当使用字符串插值而不是直接使用可选变量时.对于字符串连接,如果我们直接使用选项,则没有问题.问题在于插值.

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

你可以在Swift字符串插值中得到更多关于内存泄漏的信息.看起来像一个bug,可能在将来的版本中它将被解决.