为什么在 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。
似乎是一个错误,可能会在未来的版本中解决。
泄漏是一个根泄漏,在这个图像中在同一条线上被多次引起,但下面还有一个被称为单次并且也产生泄漏.
这是在 调用前面所述的代码行之后的调用堆栈。
这是 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。 似乎是一个错误,可能会在未来的版本中解决。