ios - 表格视图单元格按钮关闭是否需要弱自我
问题描述
为了避免保留周期,是否[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)
}
解决方案
要考虑的关键线是:
var buttonAction: ((UITableViewCell) -> Void)?
您提供将函数长期存储在实例属性中。
现在想想谁指的是/拥有谁。视图控制器拥有它的视图,该视图是或拥有拥有该单元格的表视图。同时细胞拥有该功能。如果函数强烈引用我刚才提到的任何对象,那就是一个保留循环。这是一个经典的保留周期,是如何制作保留周期的绝对模型。
[我想补充一点关于我如何测试这些东西的内容。有一个非常便宜且简单的方法:将您的视图控制器包装在一个导航控制器和一个空白的根视图控制器中,这样您就可以将您的视图控制器推到它上面。deinit
在您的视图控制器中实现。现在运行应用程序,按下视图控制器,玩一会儿,然后使用返回按钮弹出它。如果deinit
未调用,则您有一个保留周期。]
推荐阅读
- azure-devops - 用于测试用例参数值的 Azure DevOps REST API
- azure-logic-apps - 逻辑应用将继续检查 HTTP 202 Accepted 响应多长时间?
- javascript - 如何访问对象内的数组值?
- cucumber - 无法加载插件类:com.aventstack.extentreports.cucumber.adapter.ExtentCucumberAdapter Cucumber 5.4.2
- excel - 矩阵的匹配和条件格式
- regex - 如果找不到分隔符,则捕获所有内容
- c# - 如何在 Gridview 中将图像与 URL 绑定 - ASP.Net
- firebase - 两种不同类型的用户
- ios - iOS 上工具栏项中的图像是白色的(Xamarin 表单)
- c++ - 如何让不同的线程一起填充一个数组?