泄漏是根泄漏,在这张图中,在同一行上被多次引起,但下面还有一个称为单次,也会产生泄漏。
这是调用上述代码行之后的调用堆栈。
这是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"
}
最后一个字符串发出“条件转换从' String !‘到String always succeeds”。
所以,即使这看起来像是黑客攻击。
为什么这会导致泄漏?
发布于 2015-05-09 11:07:43
我测试了你的代码,并通过了一些线程,我的理解是,当使用字符串插值而不是直接使用可选变量时,你必须使用可选的绑定if let
子句。对于字符串连接,如果我们直接使用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。看起来像是一个bug,可能会在未来的版本中得到解决。
https://stackoverflow.com/questions/30039199
复制相似问题