gpt4 book ai didi

swift - 使用另一个类的函数分配变量时是否存在内存循环?

转载 作者:可可西里 更新时间:2023-11-01 00:39:00 26 4
gpt4 key购买 nike

下面的代码有内存循环吗?据我所知,AnswersCollectionViewDelegate 有一个对 ViewController 的隐式引用,因为闭包 cellClickHandler 是引用类型,但我无法标记 var cellClickHandler: ( (Int) -> Void))? 作为 weak 因为错误 'weak' 可能只应用于类和类绑定(bind)协议(protocol)类型,而不是 '(Int) -> 无效'

class AnswersCollectionViewDelegate: NSObject, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

var cellClickHandler: ((Int) -> Void))?

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
cellClickHandler(indexPath.Item)
}
}

class ViewController: UIViewController{

let answersDelegate = AnswersCollectionViewDelegate()

@IBOutlet weak var answersCollectionView: UICollectionView!{
didSet{
answersDelegate.cellClickHandler = showNextPost
answersCollectionView.delegate = answersDelegate
answersCollectionView.dataSource = answersDelegate
}
}

func showNextPost(answer: Int){
//analyzeAnswer&showNextPost
}
}

最佳答案

是的,这是一个需要注意的微妙之处,所以我认为您已经真正理解了引用循环是如何发生的。 There is some current work in the compiler to try to detect this and provide a warning ,但目前由开发人员手动推理。

解决方案是在这里不使用函数引用,而是使用闭包:

answersDelegate.cellClickHandler = { [weak self] self?.showNextPost(answer: $0) }

关于马特在下面的评论:名称中带有“委托(delegate)”的属性几乎总是弱的(或者最多有一个在某些操作完成后结束的保留循环)。也就是说,我通常喜欢你在这里做的组合模式,我不认为这是错误的(我可能做的一件事是在 AnswersCollectionViewDelegate 中传递 cellClickHandler。 init 而不是稍后设置)。不过,值得记住的是,当其他开发人员在属性名称中看到“delegate”一词时,他们会认为它很弱,以后可能会导致错误。我可能会称它为 clickHandler 而不是 answersDelegate

关于swift - 使用另一个类的函数分配变量时是否存在内存循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51572305/

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