孤立的 Swift 对象参考自身未被释放

问题描述

我遇到了一些我以前从未见过的事情,这与通常在 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 (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...