【问题标题】:URL memory leakURL 内存泄漏
【发布时间】:2017-07-31 19:02:54
【问题描述】:

仪器显示这些代码行导致内存泄漏,我做错了什么?

   required init(data: JSON) {
        self.type = data["type"].stringValue
        self.name = data["name"].stringValue
        self.numberOfRestaraunts = data["length"].intValue
        self.isFavourited = data["isFavourited"].boolValue
        self.image = URL(string: data["img"].stringValue)! //<- this
        self.id = data["id"].stringValue
        self.headerImage = URL(string: data["header"].stringValue)! //<- this
        if data["colorSchema"].stringValue == "Dark" {
            self.colorTheme = .dark
        } else {
            self.colorTheme = .light
        }
        self.color = data["color"].stringValue
        self.metaScore = data["metaScore"].intValue
        self.typeMetaScore = data["typeMetaScore"].int ?? 0
    }

它实际上表明,泄漏是NSURL 类。

编辑:截图:

【问题讨论】:

  • 仪器显示什么样的泄漏?
  • @Eendje 添加了截图

标签: ios swift memory-leaks instruments


【解决方案1】:

您正在强制展开可选对象。尝试将self.image = URL(string: data["img"].stringValue)!这一行改为

if let url = URL(string: data["img"].stringValue) {
   self.image = url
}

这个self.headerImage = URL(string: data["header"].stringValue)! 行到

if let url = URL(string: data["header"].stringValue) {
   self.headerImage = url
}

强制展开不是一个好习惯,你应该尽可能避免它。希望这会有所帮助!

【讨论】:

  • 仍然泄漏,在if let
  • 我不同意使用强制展开是不好的做法。如果您确定在特定情况下对象不能始终为 nil,那么我将用户强制展开而不是可选展开。那是因为如果稍后我在代码中的这个地方出错,我知道代码逻辑有问题 - 因为我假设不能有 nil,那么当它出现时最好得到一个错误 - 然后你知道你需要找出为什么不是。在任何其他情况下,当 optional 可能为 nil 时,您应该使用 optional unwrapping,但如果您确定 - 使用 force。
  • 我不是在谈论这种情况,而是在谈论整体实践。
【解决方案2】:

你能试试这个吗?

if let image_url = URL(string: data["img"].stringValue)
{
    self.image = image_url
}

……还有这个……

if let header_url = URL(string: data["header"].stringValue)
{
    self.headerImage = image_url
}

您能否检查JSON 类型subscript 是否返回Optional

【讨论】:

  • 仍然泄漏,JSON 返回String,而不是Optional
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 2013-01-20
  • 2011-10-31
  • 2019-08-10
  • 2013-06-24
  • 2011-03-22
  • 2015-04-20
相关资源
最近更新 更多