为变量分配另一个类的函数时,是否存在存储周期?

时间:2018-07-28 14:32:11

标签: swift

下面的代码中是否存在存储周期?据我所知,AnswersCollectionViewDelegateViewController的隐式引用是因为闭包cellClickHandler是引用类型,但由于错误{我无法将var cellClickHandler: ((Int) -> Void))?标记为weak {1}}

'weak' may only be applied to class and class-bound protocol types, not '(Int) -> Void'

1 个答案:

答案 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