gpt4 book ai didi

ios - UITableViewCell 强引用循环,但未被 Instruments 中的 Leaks 发现

转载 作者:行者123 更新时间:2023-12-01 16:19:50 25 4
gpt4 key购买 nike

我正在使用自定义 UITableViewCells 填充 UITableView,每个 UITableViewCells 中都有一个按钮。为了检查按钮是否被按下,我使用了委托(delegate)协议(protocol)模式。这是我的实现:

protocol MyTableViewCellDelegate {
func didPressButtonInTableView(for indexPath: IndexPath)
}

class MyTableViewCell: UITableViewCell {

lazy var indexPath = (self.superview?.superview as! UITableView).indexPath(for: self)
var delegate: MyTableViewCellDelegate!

@IBAction func buttonPressed(_ sender: Any) {
self.delegate.didPressButtonInTableView(for: self.indexPath!)
}

}

在阅读了一些关于内存管理的内容后,我意识到有时候,由于“强引用循环”,持有父类引用的子类实例不会被释放,因为父类和子类都持有相互之间有很强的引用性。我们必须使用 weak 关键字来定义弱关系,当父类被释放时,子类也会被释放。

因此,我意识到使用委托(delegate)持有对 UITableView(父类)的强引用。运行一些测试,比如在 Xcode 调试器中检查内存使用情况并在子类中使用 deinit,我意识到这些 TableView 单元格没有被释放。将协议(protocol)更改为使用 AnyObject 然后将委托(delegate)设置为 weak 解决了这个问题。再次运行时,内存使用量并没有继续增加,当我转到不同的 View 时调用了 deinit

在 Leaks in Instruments 中运行两个版本的代码,第一种情况下没有内存泄漏,但是,每次加载 TableView 时,内存都有非常明显的增加。

我的问题是,为什么这在 Instruments 中没有被标记为内存泄漏,因为子类使用委托(delegate)持有对父类的强引用?这与导致 Instruments 捕获泄漏的传统父子字符串引用有什么区别?

最佳答案

那是因为tableView重用了cell。由于 tableview 单元格被重用,它们往往只有在 tableview 本身被取消时才会被取消。因为即使它们现在不被使用,tableview 也会让它们保持事件状态,以备不时之需。

关于ios - UITableViewCell 强引用循环,但未被 Instruments 中的 Leaks 发现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63210658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com