gpt4 book ai didi

ios - 为什么我必须保留对 tableView 数据源的强引用?

转载 作者:行者123 更新时间:2023-11-30 11:07:33 26 4
gpt4 key购买 nike

我注意到,当我手动设置 tableview 数据源时,我必须保留对它的强引用,否则,将不会调用 cellForRowAt 。 (请注意,numberOfRowsInSectionnumberOfSections 被调用)

class YAExploreViewController: UIViewController {
...
dataSourceSubject
.subscribe(onNext: { dataSource in
// I'm not storing a strong reference to the dataSource, and cellForRowAt wouldn't get called
self.tableView.dataSource = dataSource
self.tableView.reloadData()
})
.disposed(by: self.bag)
...
}

解决方案:

class YAExploreViewController: UIViewController {
var exploreDataSource: YAExploreDataSource?

...
dataSourceSubject
.subscribe(onNext: { dataSource in
// I'm storing a strong reference to the dataSource, and cellForRowAt got called
self.dataSource = dataSource
self.tableView.dataSource = self.dataSource
self.tableView.reloadData()
})
.disposed(by: self.bag)
...
}

我注意到 tableView dataSource 属性有一个描述:

The object that acts as the data source of the table view. The data source must adopt the UITableViewDataSource protocol. The data source is not retained.

我想知道这是否相关。

谢谢

最佳答案

在 TableView 中,dataSource 属性遵循“委托(delegate)模式”(在 UIKit 中广泛使用),这意味着它必须是weak,并且您必须自己保留它.

主要原因是,如果 TableView 对dataSource有强引用,则在许多情况下可能会产生引用循环和内存泄漏(例如,如果您的 View Controller 是数据来源)

class MyController: UIViewController {
@IBOutlet var tableview: UITableView?

override func viewDidLoad() {
super.viewDidLoad()
tableview?.dataSource = self
}
}

extension MyController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 0
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
return UITableViewCell(frame: .zero)
}
}

如果dataSource引用,这会导致内存泄漏。

如果您想了解有关 Swift 中如何管理内存的更多信息,请查看 Automatic Reference Counting文档。

关于ios - 为什么我必须保留对 tableView 数据源的强引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52536239/

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