我在两种方法之间感到困惑,无法在我的一个班级中从另一个班级获得callback
。
这是我的情况:
class TableCell: UITableViewCell {
var callBack:(()->())?
}
我想在控制器类中使用此callback
。我知道这两种方式:
方法1:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Identifier", for: indexPath) as! CustomCell
cell.callBack = {[weak self] () in
}
return cell
}
方法2:
func callBackFunction() {
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Identifier", for: indexPath) as! CustomCell
cell.callBack = callBackFunction
return cell
}
在第一种方法中,参考值很弱,方法2是否相同?哪种方法更好?恳求也添加了适当的解释。
答案 0 :(得分:1)
在直接选择上述选项之一之前,我们应该认识到[weak self]
部分是什么。 [weak self]
称为封包捕获列表;是什么原因呢?好吧,请记住,Swift中的闭包是引用类型,每当您将函数或闭包分配给常量或变量时,您实际上是在将该常量或变量设置为对该函数的引用或关闭。这意味着在某个时候,如果您在代码中滥用闭包,可能会导致保留周期。
引用The Swift Programming Language - Closures:
如果将闭包分配给类实例的属性,则 闭包通过引用该实例或其实例来捕获该实例 成员,您将在关闭之间创建一个强大的参考周期 和实例。 Swift使用捕获列表来打破这些强大 参考周期。
这意味着如果要在闭包主体中使用self
,则必须遵循第一种方法。在捕获列表中使用弱项self可以解决(预防)保留周期的原因,这就是为什么您选择第一种方法的原因。
有关其完成方式的更多信息,我强烈建议您检查:“自动引用计数”的Resolving Strong Reference Cycles for Closures部分。