首页 > 解决方案 > 表格视图单元格按钮关闭是否需要弱自我

问题描述

为了避免保留周期,是否[weak self] in有必要在 UITableViewCell 按钮操作中使用?例子:

在 ViewController 的cellForRow

cell.buttonAction = { (cell) [weak self] in
     self.someFunction()
}

在 TableViewCell 类中

var buttonAction: ((UITableViewCell) -> Void)?

@IBAction func buttonPressed(_ sender: Any) {
     buttonAction?(self)
}

标签: iosswiftuitableviewuibuttonretain-cycle

解决方案


要考虑的关键线是:

var buttonAction: ((UITableViewCell) -> Void)?

您提供将函数长期存储在实例属性中。

现在想想谁指的是/拥有谁。视图控制器拥有它的视图,该视图是或拥有拥有该单元格的表视图。同时细胞拥有该功能。如果函数强烈引用我刚才提到的任何对象,那就是一个保留循环。这是一个经典的保留周期,是如何制作保留周期的绝对模型。


[我想补充一点关于我如何测试这些东西的内容。有一个非常便宜且简单的方法:将您的视图控制器包装在一个导航控制器和一个空白的根视图控制器中,这样您就可以您的视图控制器推到它上面。deinit在您的视图控制器中实现。现在运行应用程序,按下视图控制器,玩一会儿,然后使用返回按钮弹出它。如果deinit未调用,则您有一个保留周期。]


推荐阅读