首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么在swift中创建字符串时会有内存泄漏?

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

Stack Overflow用户
提问于 2015-05-05 04:18:15
回答 1查看 6.4K关注 0票数 25

泄漏是根泄漏,在这张图中,在同一行上被多次引起,但下面还有一个称为单次,也会产生泄漏。

这是调用上述代码行之后的调用堆栈。

这是Instruments定位泄漏的类:

代码语言:javascript
复制
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更改为:

代码语言:javascript
复制
var description: String {
    return "(" + id + ") " + name
}

更新:

代码语言:javascript
复制
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”。

所以,即使这看起来像是黑客攻击。

为什么这会导致泄漏?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-09 11:07:43

我测试了你的代码,并通过了一些线程,我的理解是,当使用字符串插值而不是直接使用可选变量时,你必须使用可选的绑定if let子句。对于字符串连接,如果我们直接使用optionals就没有问题。问题出在插值上。

代码语言:javascript
复制
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,可能会在未来的版本中得到解决。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30039199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档