Swift 存储为变量的闭包会产生内存泄漏
Swift closure stored as a variable produces memory leak
我在将闭包定义为变量时有一个保留周期。
变量定义如下:
public class MyCell: UICollectionViewCell {
public var callback: ((MyCell)->Void)?
}
如果我使用委托而不是闭包,保留循环就会消失,但我想知道如何用闭包定义它以备将来使用。
我尝试将回调变量设置为 weak
,但是,正如我所想,weak 属性只能应用于 class 和 class 绑定的协议类型。
编辑
用法:
class CustomController: UIViewController {
private func onActionOccurs(_ cell: MyCell) {
cell.backgroundColor = .red // For example
}
// After dequeuing the cell:
{
cell.callback = onActionOccurs(_:)
}
}
谢谢
如果您不需要使用 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()
}
}
}
我在将闭包定义为变量时有一个保留周期。
变量定义如下:
public class MyCell: UICollectionViewCell {
public var callback: ((MyCell)->Void)?
}
如果我使用委托而不是闭包,保留循环就会消失,但我想知道如何用闭包定义它以备将来使用。
我尝试将回调变量设置为 weak
,但是,正如我所想,weak 属性只能应用于 class 和 class 绑定的协议类型。
编辑
用法:
class CustomController: UIViewController {
private func onActionOccurs(_ cell: MyCell) {
cell.backgroundColor = .red // For example
}
// After dequeuing the cell:
{
cell.callback = onActionOccurs(_:)
}
}
谢谢
如果您不需要使用 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()
}
}
}