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