问题描述
我遇到了一些我以前从未见过的事情,这与通常在 Swift 中提到的关于闭包的常规保留周期问题不同,我想知道是否有人可以帮助我指明正确的方向:
>class Cell {
var tapHandler: (() -> Void)?
var isTitleCell = false
deinit {
print("cell deinit")
}
}
protocol TableViewDataSource: class {
func cellForRow(_ cell: Cell)
}
class TableView {
var cell = Cell()
weak var dataSource: TableViewDataSource? {
didSet {
dataSource?.cellForRow(cell)
}
}
deinit {
print("table view deinit")
}
}
class ViewController: TableViewDataSource {
var tableView = TableView()
init() {
tableView.dataSource = self
}
func cellForRow(_ cell: Cell) {
cell.tapHandler = {
if cell.isTitleCell {
// ..
}
else {
// ...
}
}
}
deinit {
print("view controller deinit")
}
}
var controller: ViewController? = ViewController()
controller = nil
//CONSOLE:
// view controller deinit
// table view deinit
上面我重新创建了一个非常简单的具有表视图的视图控制器示例。该表视图将一个单元格发送回控制器。我认为代码广泛地不言自明,但在 cellForRow
的视图控制器实现中,我有单元格引用本身(不是 self
),因此视图控制器可以根据类型绘制其下一步单元格。
此引用似乎在单元格和...单元格之间创建了一个保留循环。当我将视图控制器设置为 nil
时,表视图和视图控制器都被解除分配,但单元格仍然存在。
如果我弱捕获单元格,那么它确实会解除分配。
那么,我的问题是,这完全正常吗?可以在两个相同的对象之间创建保留循环吗(看起来是的,但我希望得到一些澄清/确认)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)