Swift闭包存储为变量会导致内存泄漏

3
当我将闭包定义为变量时,会出现保留循环引用的情况。
变量定义如下:
public class MyCell: UICollectionViewCell {
    public var callback: ((MyCell)->Void)?
}

如果我使用代理而不是闭包,保留周期就会消失,但我想知道如何使用闭包定义以备将来之需。

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

编辑

用法:

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

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

谢谢


请查看以下链接:https://stackoverflow.com/questions/49302197/add-unowned-self-to-the-closure-argument-swift/49302347#49302347 - Reinier Melian
1
作为参数添加 weak self - Joakim Danielson
如果回调参数是实例本身,则可以像@JoakimDanielson所说的那样将MyCell更改为weak self - Rakesha Shastri
1
为什么将MyCell作为参数传递给块?没有必要这样做,无论在哪里分配块变量,您都可以捕获单元格。 - vivekDas
你能发布一下你是如何使用这个闭包吗? - Reinier Melian
修改了问题 - Alberto García
1个回答

6
如果您不需要使用self,那么可以使用cell本身,并将您的闭包在cell中进行修改,如下所示:

如果您不需要使用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那样使用。 - flyingBear
因为如果你使用 cell.callback = onActionOccurs(_:)cell 将持有 UIViewController 的引用,这是一个保留循环。Reinier 的想法是将回调仅保存在堆栈内存中的闭包,它将在函数调用后被销毁。 - Weidian Huang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接