【发布时间】:2015-07-14 08:58:43
【问题描述】:
泄漏是Root Leak,在这张图片中,同一行发生了多次,但下面还有一个称为单次泄漏,也会产生泄漏。
这是调用栈之后调用前面所述的代码行。
这是 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!'的条件转换! to String 总是成功”。
所以,即使这看起来像是一个 hack。
为什么会导致泄漏?
【问题讨论】:
-
很可能是这个类之外的东西导致了泄漏。检查创建此 Item 对象的类。它是引用 id 还是 name?另外,泄漏是一个“循环”吗?这也表明这个类之外的东西正在持有对它的引用。
-
@Stephen 我已经更新了问题,添加了一些关于泄漏的见解
-
两种形式的字符串连接都应该是有效的。看起来这可能是苹果的错误。您可以尝试向 Apple 提交错误报告。
标签: swift memory-leaks