【问题标题】:Swift closure stored as a variable produces memory leak存储为变量的 Swift 闭包会产生内存泄漏
【发布时间】:2019-01-08 19:03:10
【问题描述】:

在将闭包定义为变量时,我有一个保留周期。

变量定义如下:

public class MyCell: UICollectionViewCell {
    public var callback: ((MyCell)->Void)?
}

如果我使用委托而不是闭包,保留周期就会消失,但我想知道如何为未来的情况使用闭包来定义它。

我尝试将回调变量设置为weak,但我想,弱属性只能应用于类和类绑定协议类型。

编辑

用法:

class CustomController: UIViewController {
   private func onActionOccurs(_ cell: MyCell) {
       cell.backgroundColor = .red // For example
   }

   // After dequeuing the cell:
   {
       cell.callback = onActionOccurs(_:)
   }
}

谢谢

【问题讨论】:

  • 添加weak self 作为参数?
  • 如果回调参数是实例本身,那么MyCell可以像@JoakimDanielson说的那样改成weak self
  • 为什么将 MyCell 作为参数传递给块?不需要这个,无论你在哪里分配块变量,你都可以捕获单元格。
  • 你能发布一下你是如何使用这个单元格闭合的吗?

标签: ios iphone swift memory-leaks retain-cycle


【解决方案1】:

如果您不需要使用 self,那么您可以使用单元格本身,并像这样修改单元格中的闭包实现

public class MyCell: UICollectionViewCell {
    public var callback: (()->Void)?
}

那么你就可以使用它了,就像这个例子

class CustomController: UIViewController {
   private func onActionOccurs(_ cell: MyCell) {
       cell.backgroundColor = .red // For example
   }

   // After dequeuing the cell:
   {
       cell.callback = {
         cell.backgroundColor = .red // For example
        }
   }
}

但是如果你需要使用 ViewController 方法那么你需要使用[weak self] 捕获列表 如果您需要使用 UIViewController 方法

class CustomController: UIViewController {
   private func onActionOccurs(_ cell: MyCell) {
       cell.backgroundColor = .red // For example
   }

   // After dequeuing the cell:
   {
       cell.callback = { [weak self] in
         guard let self = self else { return }

         self.viewControllerMethod()
        }
   }
}

【讨论】:

  • 任何人都知道如果我们这样使用它为什么会留在内存中? cell.callback = onActionOccurs(_:) 。我知道它在某些情况下使用 self ,但有些甚至没有使用 self 函数或方法。如果我们不像 Reinier 那样使用,还是留下来。
  • 因为如果你使用cell.callback = onActionOccurs(_:),cell会持有来自UIViewController的引用,这是一个retain循环。 Reinier 的想法回调只是在栈内存中持有一个闭包,它会在函数调用后被销毁。
猜你喜欢
  • 1970-01-01
  • 2017-11-25
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 2016-01-12
相关资源
最近更新 更多