Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用UITableView dequeueReusableCell时内存泄漏_Ios_Swift_Uitableview_Memory Leaks_Swift4 - Fatal编程技术网

Ios 使用UITableView dequeueReusableCell时内存泄漏

Ios 使用UITableView dequeueReusableCell时内存泄漏,ios,swift,uitableview,memory-leaks,swift4,Ios,Swift,Uitableview,Memory Leaks,Swift4,我已经在instruments“leaks”工具中检查了我的应用程序是否存在内存泄漏 在负责UtableView内容的控制器上发现了大约16个 这是密码- func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "claus

我已经在instruments“leaks”工具中检查了我的应用程序是否存在内存泄漏 在负责UtableView内容的控制器上发现了大约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
}

当我将代码更改为以下内容时:

    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
}
未检测到泄漏

泄漏的原因是什么?我用错了吗

我想使用这个函数,因为它的性能更好, 我想知道这里出了什么问题

谢谢

编辑:

添加单元格类代码(此处没有特别之处):


}

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

从字符串上的apple文档:

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

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

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

如果您的CodeOfConductTableViewCell()初始值设定项正在从Xcode加载资源,那么它将有读取xib的开销,这可能解释您看到的性能差异


您应该在模块中将标识符设置为常量,并查看泄漏是否消失,因为编译器将只分配它一次。

您所说的“性能更佳”是什么意思?在第一个示例中,您是如何在单元格中创建标签和文本视图的?变量是否声明为弱变量?@skladek是的,它们被声明为弱输出。无需特殊初始化。@ChipCoons此函数不创建新单元格,而是重用屏幕外的单元格。如果我有一个非常大的表,如果我继续创建新的单元格,应用程序将耗尽内存。行包含什么?我将“子句”设置为静态字符串。仍然泄漏…:(我创建了一个简单的测试项目,其中包含UITableView和代码的近似值(显然它没有CodeOfConductTableViewCell对象),无法创建泄漏条件。我怀疑您的view cell类中存在泄漏源。稍后我将对其进行测试,但更改后的代码示例不也应该出现泄漏吗?(我正在显式创建CodeOfConductTableViewCell)我已经将其剥离,只返回未分配任何数据的出列单元格。仍然泄漏:(我已将单元格类代码添加到上述问题中。只有两个出口。我正在失去它,伙计…..您是否有行的测试数据集?在没有这一行的情况下重新创建代码也不会泄漏。(即注释掉cell.cocTxt.text=lines[“line(indexPath.row+1)”行)
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)

}