【问题标题】:iOS Swift 3: does retain cycle happens in this case?iOS Swift 3:在这种情况下会发生保留周期吗?
【发布时间】:2017-06-16 07:40:20
【问题描述】:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "CheckoutCell") as! CheckoutCell

    let product = shoppingCart[indexPath.row]

    var tfQuantity : UITextField!
    cell.clickEditAction = { [weak self] celll in
        guard let ss = self else { return }
        let alert = UIAlertController(title: nil, message: "Enter new quantity", preferredStyle: .alert)

        alert.addTextField { (textfield) in
            tfQuantity = textfield
        }

        let okAction = UIAlertAction(title: "OK", style: .default) { (action) in
            if tfQuantity.text == ""{
                return
            }

            if let newQuantity = Int(tfQuantity.text){
                product.quantity = newQuantity
                self.tbvCheckout.reloadData()
            }
            return
        }

        alert.addAction(okAction)
        self.present(alert, animated: true, completion: nil)
    }

    return cell
}

这行代码:

self.tbvCheckout.reloadData()

如果我不使用 [weak self] 或 [unowned self],它是否会在当前对象和 UIAlertAction 实例之间创建保留循环? 如果我改用这段代码会怎样:tableView.reloadData()?

【问题讨论】:

  • 我猜,它会保留。测试这一点的一个好方法是将记录器添加到 VIewControllers 的生命周期方法中。当 Destroyed (当你从堆栈中解除控制器时)将被调用,你知道,它可以释放对象。如果没有,你可以说有一些对象保留。另外,我不知道这是否是一个好习惯,但是当我在完成/处理程序/调度块中使用self 时,我会创建一个弱自变量
  • 是的,因为在这两种情况下,索引行的单元格都会调用无限时间。
  • 如果我改用这段代码会怎样:tableView.reloadData()?在这种情况下,我不捕获“self”,tableView 变量是从 UITableView 的委托方法获取的

标签: ios swift retain-cycle


【解决方案1】:

几件事:

首先,您创建了一个弱引用,但我没有看到您在代码中使用它。

guard let ss = self else { return }

任何对 self 的引用都应该通过您创建的这个弱 self 变量 "ss"

其次,警报动作块也应该对self有弱引用

let okAction = UIAlertAction(title: "OK", style: .default) { [weak self] (action) in
        if tfQuantity.text == ""{
            return
        }

        if let newQuantity = Int(tfQuantity.text){
            product.quantity = newQuantity
            self?.tbvCheckout.reloadData()
        }
        return
    }

【讨论】:

  • 好的,我理解那部分。但是如何使用这行代码:tableView.reloadData()?我这里没有捕获“self”,tableView 变量是从 UITableView 的委托方法中获取的
猜你喜欢
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多