以正确的方式分配回调

时间:2018-08-14 08:00:19

标签: ios swift

我在两种方法之间感到困惑,无法在我的一个班级中从另一个班级获得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是否相同?哪种方法更好?恳求也添加了适当的解释。

1 个答案:

答案 0 :(得分:1)

在直接选择上述选项之一之前,我们应该认识到[weak self]部分是什么。 [weak self]称为封包捕获列表;是什么原因呢?好吧,请记住,Swift中的闭包是引用类型,每当您将函数或闭包分配给常量或变量时,您实际上是在将该常量或变量设置为对该函数的引用或关闭。这意味着在某个时候,如果您在代码中滥用闭包,可能会导致保留周期

引用The Swift Programming Language - Closures

  

如果将闭包分配给类实例的属性,则   闭包通过引用该实例或其实例来捕获该实例   成员,您将在关闭之间创建一个强大的参考周期   和实例。 Swift使用捕获列表来打破这些强大   参考周期。

这意味着如果要在闭包主体中使用self,则必须遵循第一种方法。在捕获列表中使用弱项self可以解决(预防)保留周期的原因,这就是为什么您选择第一种方法的原因。

有关其完成方式的更多信息,我强烈建议您检查:“自动引用计数”的Resolving Strong Reference Cycles for Closures部分。