下面的代码中是否存在存储周期?据我所知,AnswersCollectionViewDelegate
对ViewController
的隐式引用是因为闭包cellClickHandler
是引用类型,但由于错误{我无法将var cellClickHandler: ((Int) -> Void))?
标记为weak
{1}}
'weak' may only be applied to class and class-bound protocol types, not '(Int) -> Void'
答案 0 :(得分:4)
是的,并且要注意这是一个微妙的事情,所以我认为您已经真正了解了参考周期是如何发生的。 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) }
关于以下matt的评论:名称中带有“ delegate”的属性几乎总是弱的(或至多具有在某些操作完成后结束的保留循环)。就是说,我通常喜欢您在此处执行的合成模式,并且我认为这不是错误的(我可能要做的一件事是在cellClickHandler
中传递AnswersCollectionViewDelegate.init
而不是设置稍后再说)。但是,值得记住的是,当其他开发人员在属性名称中看到“委托”一词时,他们会认为它很弱,以后可能会导致错误。我可能将其称为clickHandler
而不是answersDelegate
。