使用UITableView dequeueReusableCell时发生内存泄漏

时间:2018-07-11 14:28:47

标签: ios swift uitableview memory-leaks swift4

我已经在“泄漏”工具中检查了我的应用程序是否存在内存泄漏 并在负责UITableView内容的控制器上找到其中的16个。

这是代码-

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "clause", for: indexPath) as! CodeOfConductTableViewCell

    cell.index.text = String(indexPath.row + 1)
    cell.cocTxt.text = lines["line\(indexPath.row + 1)"]

    return cell
}

enter image description here

当我将代码更改为此:

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = CodeOfConductTableViewCell()

    cell.index = UILabel()
    cell.cocTxt = UITextView()

    cell.index?.text = String(indexPath.row + 1)
    cell.cocTxt?.text = lines["line\(indexPath.row + 1)"]

    return cell
}

在没有发现泄漏的地方。

是什么引起泄漏?我用错了吗?

我想使用此功能,因为它可以提高性能, 我想了解这里出了什么问题

谢谢!

编辑:

添加单元格类代码(这里没什么好看的):

class CodeOfConductTableViewCell: UITableViewCell {

@IBOutlet weak var index: UILabel!
@IBOutlet weak var cocTxt: UITextView!

override func awakeFromNib() {
    super.awakeFromNib()

}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

}

}

1 个答案:

答案 0 :(得分:2)

问题出在方法调用totableView.dequeueReusableCell中的字符串文字(“子句”)。

从Apple文档上的字符串开始:

  

您可以使用字符串文字或字符串创建新字符串   插值。字符串文字是包含在其中的一系列字符   引号。

还有

  

尽管Swift中的字符串具有值语义,但是字符串使用   写时复制策略可将其数据存储在缓冲区中。这个缓冲区   然后可以由字符串的不同副本共享。字符串的数据是   当多个字符串实例发生突变时,仅延迟复制   使用相同的缓冲区。

我相信每次使用字符串文字的创建来调用该方法时,您都会分配48个字节。我认为编译器应该对此进行优化,但不确定。

如果您的CodeOfConductTableViewCell()初始化程序正在从Xcode加载资源,则它将具有读取xib的开销,这也许可以解释您所看到的性能差异。

您应该在模块中使标识符为常数,并检查泄漏是否消失,因为编译器仅会分配一次。