gpt4 book ai didi

ios - 为什么会导致保留循环?

转载 作者:行者123 更新时间:2023-11-28 05:49:36 26 4
gpt4 key购买 nike

我正在使用 Eureka设置我的表格 View 。我有一个标题部分:

Section() { [weak self] in
guard let strongSelf = self else { return }
var header = HeaderFooterView<MyView>(.nibFile(name: "MView", bundle: nil))
header.onSetupView = strongSelf.setUpHeader(view:section:)
$0.header = header
...
}

private func setUpHeader(view: MyView, section: Section) {
// content here doesn't seem to make a difference.
}

出于某种原因,它总是在 header.onSetupView = strongSelf.setUpHeader(view:section:) 行上设置一个保留周期。如果我将 setUpHeader(view: MyView, section: Section) 函数中的代码移动到这样的 block 中,则没有保留周期:

header.onSetupView = { [weak self] view, section in

}

这是为什么??

最佳答案

header.onSetupView = strongSelf.setUpHeader(view:section:)

这一行创建了对 strongSelf 的强引用,它是对 self 的强引用,因此可传递地创建了对 self 的强引用在 onSetupView 闭包中。

换句话说,你在这里写的是一样的:

header.onSetupView = { view, section in
strongSelf.setupHeader(view: view, section: section)
}

因为 strongSelf 是对 self 的强引用,所以这与对 self 的强引用是一样的:

header.onSetupView = { view, section in
self.setupHeader(view: view, section: section)
}

还有一种说法:self 不能在 strongSelf 之前被释放,因为那样 strongSelf 将是一个无效引用。

关于ios - 为什么会导致保留循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53378185/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com